目录
实际开发中,关于日期的设定都是通过QDateEdit控件设置的,但是该控件默认会有一个初试时间设定,无法手动删除。这就需要我们自行实现这个功能,以下就是全部的代码了,供大家参考使用:
- class CUIDateEdit : public QDateEdit
- {
- Q_OBJECT
- public:
- explicit CUIDateEdit(QWidget *parent = 0);
-
- QDateTime dateTime() const;
- QDate date() const;
- QTime time() const;
-
- bool isNullable() const;
- void setNullable(bool enable);
-
- QSize sizeHint() const;
- QSize minimumSizeHint() const;
-
- protected:
- void showEvent(QShowEvent *event);
- void resizeEvent(QResizeEvent *event);
- void paintEvent(QPaintEvent *event);
- void keyPressEvent(QKeyEvent *event);
- void mousePressEvent(QMouseEvent *event);
- bool focusNextPrevChild(bool next);
- QValidator::State validate(QString &input, int &pos) const;
-
- public slots:
- void setDateTime(const QDateTime &dateTime);
- void setDate(const QDate &date);
- void setTime(const QTime &time);
-
- private:
- Q_DISABLE_COPY(CUIDateEdit)
- class Private;
- friend class Private;
- Private* d;
- };
- #include "CUIDateEdit.h"
- #include <QDateEdit>
- #include <QStyle>
- #include <QPushButton>
- #include <QLineEdit>
- #include <QStyleOptionSpinBox>
- #include <QKeyEvent>
- #include <QCalendarWidget>
-
- class CUIDateEdit::Private
- {
- public:
- Private(CUIDateEdit* qq) : q(qq), bNull(false), bNullable(false) {}
-
- CUIDateEdit* const q;
-
- bool bNull;
- bool bNullable;
-
- void setNull(bool n)
- {
- bNull = n;
- if (bNull)
- {
- QLineEdit *edit = q->findChild<QLineEdit*>("qt_spinbox_lineedit");
- if (!edit->text().isEmpty())
- {
- edit->clear();
- }
- }
- }
- };
-
- CUIDateEdit::CUIDateEdit(QWidget *parent) : QDateEdit(parent), d(new Private(this))
- {
- }
-
- QDateTime CUIDateEdit::dateTime() const
- {
- if (d->bNullable && d->bNull)
- {
- return QDateTime();
- }
- else
- {
- return QDateEdit::dateTime();
- }
- }
-
-
- QDate CUIDateEdit::date() const
- {
- if (d->bNullable && d->bNull)
- {
- return QDate();
- }
- else
- {
- return QDateEdit::date();
- }
- }
-
-
- QTime CUIDateEdit::time() const
- {
- if (d->bNullable && d->bNull)
- {
- return QTime();
- }
- else
- {
- return QDateEdit::time();
- }
- }
-
-
- void CUIDateEdit::setDateTime(const QDateTime &dateTime)
- {
- if (d->bNullable && !dateTime.isValid())
- {
- d->setNull(true);
- }
- else
- {
- d->setNull(false);
- QDateEdit::setDateTime(dateTime);
- }
- }
-
-
- void CUIDateEdit::setDate(const QDate &date)
- {
- if (d->bNullable && !date.isValid())
- {
- d->setNull(true);
- }
- else
- {
- d->setNull(false);
- QDateEdit::setDate(date);
- }
- }
-
- void CUIDateEdit::setTime(const QTime &time)
- {
- if (d->bNullable && !time.isValid())
- {
- d->setNull(true);
- }
- else
- {
- d->setNull(false);
- QDateEdit::setTime(time);
- }
- }
-
- bool CUIDateEdit::isNullable() const
- {
- return d->bNullable;
- }
-
- void CUIDateEdit::setNullable(bool enable)
- {
- d->bNullable = enable;
- update();
- }
-
-
- QSize CUIDateEdit::sizeHint() const
- {
- const QSize sz = QDateEdit::sizeHint();
- return QSize(sz.width() + 3, sz.height());
- }
-
- QSize CUIDateEdit::minimumSizeHint() const
- {
- const QSize sz = QDateEdit::minimumSizeHint();
- return QSize(sz.width() + 3, sz.height());
- }
-
- void CUIDateEdit::showEvent(QShowEvent *event)
- {
- QDateEdit::showEvent(event);
- d->setNull(d->bNull);
- }
-
- void CUIDateEdit::resizeEvent(QResizeEvent *event)
- {
- QDateEdit::resizeEvent(event);
- }
-
- void CUIDateEdit::paintEvent(QPaintEvent *event)
- {
- d->setNull(d->bNull);
- QDateEdit::paintEvent(event);
-
- }
-
- void CUIDateEdit::keyPressEvent(QKeyEvent *event)
- {
- if (d->bNullable && (event->key() >= Qt::Key_0) && (event->key() <= Qt::Key_9) && d->bNull)
- {
- setDateTime(QDateTime::currentDateTime());
- }
- if (event->key() == Qt::Key_Tab && d->bNullable && d->bNull)
- {
- QAbstractSpinBox::keyPressEvent(event);
- return;
- }
- if (event->key() == Qt::Key_Backspace && d->bNullable)
- {
- QLineEdit *edit = this->findChild<QLineEdit *>("qt_spinbox_lineedit");
- if (edit->selectedText() == edit->text())
- {
- setDateTime(QDateTime());
- event->accept();
- return;
- }
- }
-
- QDateEdit::keyPressEvent(event);
- }
-
- void CUIDateEdit::mousePressEvent(QMouseEvent *event)
- {
- bool saveNull = d->bNull;
- QDateEdit::mousePressEvent(event);
- if (d->bNullable && saveNull && calendarWidget()->isVisible()) {
- setDateTime(QDateTime::currentDateTime());
- }
- }
-
- bool CUIDateEdit::focusNextPrevChild(bool next)
- {
- if (d->bNullable && d->bNull)
- {
- return QAbstractSpinBox::focusNextPrevChild(next);
- }
- else
- {
- return QDateEdit::focusNextPrevChild(next);
- }
- }
-
- QValidator::State CUIDateEdit::validate(QString &input, int &pos) const
- {
- if (d->bNullable && d->bNull)
- {
- return QValidator::Acceptable;
- }
- return QDateEdit::validate(input, pos);
- }
CUIDateEdit *pDaEt = new CUIDateEdit();
pDaEt->setNullable(true);
这样就可以使用backspace删除啦。