• qt 自定义可删除的QDateEdit控件


    目录

    1.引言

    2.头文件

    3.源文件

    4.调用方法


    1.引言

    实际开发中,关于日期的设定都是通过QDateEdit控件设置的,但是该控件默认会有一个初试时间设定,无法手动删除。这就需要我们自行实现这个功能,以下就是全部的代码了,供大家参考使用:

    2.头文件

    1. class CUIDateEdit : public QDateEdit
    2. {
    3. Q_OBJECT
    4. public:
    5. explicit CUIDateEdit(QWidget *parent = 0);
    6. QDateTime dateTime() const;
    7. QDate date() const;
    8. QTime time() const;
    9. bool isNullable() const;
    10. void setNullable(bool enable);
    11. QSize sizeHint() const;
    12. QSize minimumSizeHint() const;
    13. protected:
    14. void showEvent(QShowEvent *event);
    15. void resizeEvent(QResizeEvent *event);
    16. void paintEvent(QPaintEvent *event);
    17. void keyPressEvent(QKeyEvent *event);
    18. void mousePressEvent(QMouseEvent *event);
    19. bool focusNextPrevChild(bool next);
    20. QValidator::State validate(QString &input, int &pos) const;
    21. public slots:
    22. void setDateTime(const QDateTime &dateTime);
    23. void setDate(const QDate &date);
    24. void setTime(const QTime &time);
    25. private:
    26. Q_DISABLE_COPY(CUIDateEdit)
    27. class Private;
    28. friend class Private;
    29. Private* d;
    30. };

    3.源文件

    1. #include "CUIDateEdit.h"
    2. #include <QDateEdit>
    3. #include <QStyle>
    4. #include <QPushButton>
    5. #include <QLineEdit>
    6. #include <QStyleOptionSpinBox>
    7. #include <QKeyEvent>
    8. #include <QCalendarWidget>
    9. class CUIDateEdit::Private
    10. {
    11. public:
    12. Private(CUIDateEdit* qq) : q(qq), bNull(false), bNullable(false) {}
    13. CUIDateEdit* const q;
    14. bool bNull;
    15. bool bNullable;
    16. void setNull(bool n)
    17. {
    18. bNull = n;
    19. if (bNull)
    20. {
    21. QLineEdit *edit = q->findChild<QLineEdit*>("qt_spinbox_lineedit");
    22. if (!edit->text().isEmpty())
    23. {
    24. edit->clear();
    25. }
    26. }
    27. }
    28. };
    29. CUIDateEdit::CUIDateEdit(QWidget *parent) : QDateEdit(parent), d(new Private(this))
    30. {
    31. }
    32. QDateTime CUIDateEdit::dateTime() const
    33. {
    34. if (d->bNullable && d->bNull)
    35. {
    36. return QDateTime();
    37. }
    38. else
    39. {
    40. return QDateEdit::dateTime();
    41. }
    42. }
    43. QDate CUIDateEdit::date() const
    44. {
    45. if (d->bNullable && d->bNull)
    46. {
    47. return QDate();
    48. }
    49. else
    50. {
    51. return QDateEdit::date();
    52. }
    53. }
    54. QTime CUIDateEdit::time() const
    55. {
    56. if (d->bNullable && d->bNull)
    57. {
    58. return QTime();
    59. }
    60. else
    61. {
    62. return QDateEdit::time();
    63. }
    64. }
    65. void CUIDateEdit::setDateTime(const QDateTime &dateTime)
    66. {
    67. if (d->bNullable && !dateTime.isValid())
    68. {
    69. d->setNull(true);
    70. }
    71. else
    72. {
    73. d->setNull(false);
    74. QDateEdit::setDateTime(dateTime);
    75. }
    76. }
    77. void CUIDateEdit::setDate(const QDate &date)
    78. {
    79. if (d->bNullable && !date.isValid())
    80. {
    81. d->setNull(true);
    82. }
    83. else
    84. {
    85. d->setNull(false);
    86. QDateEdit::setDate(date);
    87. }
    88. }
    89. void CUIDateEdit::setTime(const QTime &time)
    90. {
    91. if (d->bNullable && !time.isValid())
    92. {
    93. d->setNull(true);
    94. }
    95. else
    96. {
    97. d->setNull(false);
    98. QDateEdit::setTime(time);
    99. }
    100. }
    101. bool CUIDateEdit::isNullable() const
    102. {
    103. return d->bNullable;
    104. }
    105. void CUIDateEdit::setNullable(bool enable)
    106. {
    107. d->bNullable = enable;
    108. update();
    109. }
    110. QSize CUIDateEdit::sizeHint() const
    111. {
    112. const QSize sz = QDateEdit::sizeHint();
    113. return QSize(sz.width() + 3, sz.height());
    114. }
    115. QSize CUIDateEdit::minimumSizeHint() const
    116. {
    117. const QSize sz = QDateEdit::minimumSizeHint();
    118. return QSize(sz.width() + 3, sz.height());
    119. }
    120. void CUIDateEdit::showEvent(QShowEvent *event)
    121. {
    122. QDateEdit::showEvent(event);
    123. d->setNull(d->bNull);
    124. }
    125. void CUIDateEdit::resizeEvent(QResizeEvent *event)
    126. {
    127. QDateEdit::resizeEvent(event);
    128. }
    129. void CUIDateEdit::paintEvent(QPaintEvent *event)
    130. {
    131. d->setNull(d->bNull);
    132. QDateEdit::paintEvent(event);
    133. }
    134. void CUIDateEdit::keyPressEvent(QKeyEvent *event)
    135. {
    136. if (d->bNullable && (event->key() >= Qt::Key_0) && (event->key() <= Qt::Key_9) && d->bNull)
    137. {
    138. setDateTime(QDateTime::currentDateTime());
    139. }
    140. if (event->key() == Qt::Key_Tab && d->bNullable && d->bNull)
    141. {
    142. QAbstractSpinBox::keyPressEvent(event);
    143. return;
    144. }
    145. if (event->key() == Qt::Key_Backspace && d->bNullable)
    146. {
    147. QLineEdit *edit = this->findChild<QLineEdit *>("qt_spinbox_lineedit");
    148. if (edit->selectedText() == edit->text())
    149. {
    150. setDateTime(QDateTime());
    151. event->accept();
    152. return;
    153. }
    154. }
    155. QDateEdit::keyPressEvent(event);
    156. }
    157. void CUIDateEdit::mousePressEvent(QMouseEvent *event)
    158. {
    159. bool saveNull = d->bNull;
    160. QDateEdit::mousePressEvent(event);
    161. if (d->bNullable && saveNull && calendarWidget()->isVisible()) {
    162. setDateTime(QDateTime::currentDateTime());
    163. }
    164. }
    165. bool CUIDateEdit::focusNextPrevChild(bool next)
    166. {
    167. if (d->bNullable && d->bNull)
    168. {
    169. return QAbstractSpinBox::focusNextPrevChild(next);
    170. }
    171. else
    172. {
    173. return QDateEdit::focusNextPrevChild(next);
    174. }
    175. }
    176. QValidator::State CUIDateEdit::validate(QString &input, int &pos) const
    177. {
    178. if (d->bNullable && d->bNull)
    179. {
    180. return QValidator::Acceptable;
    181. }
    182. return QDateEdit::validate(input, pos);
    183. }

    4.调用方法

    CUIDateEdit *pDaEt = new CUIDateEdit();
    pDaEt->setNullable(true);

     这样就可以使用backspace删除啦。

  • 相关阅读:
    NGINX缓存详解之服务端缓存
    Flink学习笔记(2)——Flink快速上手
    文章《Semantic Kernel -- LangChain 的替代品?》的错误和疑问 探讨
    2022-10-27-梯度下降法结合线性回归预测公交车数量和GDP关系
    使用[阿里问题定位神器]Arthas入门
    苍穹外卖项目(黑马)学习笔记DAY10
    刚入门软件测试行业的女生就能月薪过万骗局解秘
    基于单片机超声波测距语音播放
    MySQL 多表查询
    String字符串性能优化的几种方案
  • 原文地址:https://blog.csdn.net/qq_36939187/article/details/133856691