zoukankan      html  css  js  c++  java
  • QDateEdit 设置为空,显示日历

    在项目里偶尔需要用到QDateEdit设置为空,但是QDateEdit并不支持,继承QDateEdit实现,效果:

    1.设置为空:

    #ifndef CDATEEDIT_H
    #define CDATEEDIT_H
    
    #include <QtCore>
    #include <QWidget>
    #include <QDateEdit>
    #include <QStyle>
    #include <QPushButton>
    #include <QLineEdit>
    #include <QStyleOptionSpinBox>
    #include <QKeyEvent>
    #include <QCalendarWidget>
    class CDateEdit : public QDateEdit
    {
    
        Q_OBJECT
    
    public:
        explicit CDateEdit(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(CDateEdit)
        class Private;
        friend class Private;
        Private* d;
    
    };
    
    #endif // CDATEEDIT_H
    #include "CDateEdit.h"
    
    class CDateEdit::Private {
    public:
        Private(CDateEdit* qq) : q(qq), null(false), nullable(false) {}
    
        CDateEdit* const q;
    
        bool null;
        bool nullable;
    
        void setNull(bool n) {
            null = n;
            if (null) {
                QLineEdit *edit = q->findChild<QLineEdit*>("qt_spinbox_lineedit");
                if (!edit->text().isEmpty()) {
                    edit->clear();
                }
            }
        }
    };
    
    CDateEdit::CDateEdit(QWidget *parent) :
    QDateEdit(parent), d(new Private(this))
    {
    }
    
    
    QDateTime CDateEdit::dateTime() const
    {
        if (d->nullable && d->null) {
            return QDateTime();
        }
        else {
            return QDateEdit::dateTime();
        }
    }
    
    
    QDate CDateEdit::date() const
    {
        if (d->nullable && d->null) {
            return QDate();
        }
        else {
            return QDateEdit::date();
        }
    }
    
    
    QTime CDateEdit::time() const
    {
        if (d->nullable && d->null) {
            return QTime();
        }
        else {
            return QDateEdit::time();
        }
    }
    
    
    void CDateEdit::setDateTime(const QDateTime &dateTime)
    {
        if (d->nullable && !dateTime.isValid()) {
            d->setNull(true);
        }
        else {
            d->setNull(false);
            QDateEdit::setDateTime(dateTime);
        }
    }
    
    
    void CDateEdit::setDate(const QDate &date)
    {
        if (d->nullable && !date.isValid()) {
            d->setNull(true);
        }
        else {
            d->setNull(false);
            QDateEdit::setDate(date);
        }
    }
    
    void CDateEdit::setTime(const QTime &time)
    {
        if (d->nullable && !time.isValid()) {
            d->setNull(true);
        }
        else {
            d->setNull(false);
            QDateEdit::setTime(time);
        }
    }
    
    bool CDateEdit::isNullable() const
    {
        return d->nullable;
    }
    
    void CDateEdit::setNullable(bool enable)
    {
        d->nullable = enable;
    
        update();
    }
    
    
    QSize CDateEdit::sizeHint() const
    {
        const QSize sz = QDateEdit::sizeHint();
        return QSize(sz.width() + 3, sz.height());
    }
    
    QSize CDateEdit::minimumSizeHint() const
    {
        const QSize sz = QDateEdit::minimumSizeHint();
        return QSize(sz.width() + 3, sz.height());
    }
    
    void CDateEdit::showEvent(QShowEvent *event)
    {
        QDateEdit::showEvent(event);
        d->setNull(d->null); 
    }
    
    void CDateEdit::resizeEvent(QResizeEvent *event)
    {
        QDateEdit::resizeEvent(event);
    }
    
    void CDateEdit::paintEvent(QPaintEvent *event)
    {
        d->setNull(d->null);
        QDateEdit::paintEvent(event);
    
    }
    
    void CDateEdit::keyPressEvent(QKeyEvent *event)
    {
        if (d->nullable &&
            (event->key() >= Qt::Key_0) &&
            (event->key() <= Qt::Key_9) &&
            d->null) {
            setDateTime(QDateTime::currentDateTime());
        }
        if (event->key() == Qt::Key_Tab && d->nullable && d->null) {
            QAbstractSpinBox::keyPressEvent(event);
            return;
        }
        if (event->key() == Qt::Key_Backspace && d->nullable){
            QLineEdit *edit = this->findChild<QLineEdit *>("qt_spinbox_lineedit");
            if (edit->selectedText() == edit->text()) {
                setDateTime(QDateTime());
                event->accept();
                return;
            }
        }
    
        QDateEdit::keyPressEvent(event);
    }
    
    void CDateEdit::mousePressEvent(QMouseEvent *event)
    {
        bool saveNull = d->null;
        QDateEdit::mousePressEvent(event);
        if (d->nullable && saveNull && calendarWidget()->isVisible()) {
            setDateTime(QDateTime::currentDateTime());
        }
    }
    
    bool CDateEdit::focusNextPrevChild(bool next)
    {
        if (d->nullable && d->null){
            return QAbstractSpinBox::focusNextPrevChild(next);
        }
        else {
            return QDateEdit::focusNextPrevChild(next);
        }
    }
    
    QValidator::State CDateEdit::validate(QString &input, int &pos) const
    {
        if (d->nullable && d->null){
            return QValidator::Acceptable;
        }
        return QDateEdit::validate(input, pos);
    }

    2.弹出日历

    void    setCalendarPopup(bool enable) //弹出日历

    3.样式设置

    QDateEdit
    {
        border: 1px solid #dbdbdb;
        color: #666666;
        font: 14px "微软雅黑";
    }
    
    QDateEdit:on { /* shift the text when the popup opens */
        padding-top: 3px;
        padding-left: 4px;
    }
    
    QDateEdit::drop-down {
        subcontrol-origin: padding;
        subcontrol-position: top right;
        width: 40px;
    
        border-left-color: darkgray;
        border-left-style: solid; /* just a single line */
        border-top-right-radius: 3px; /* same radius as the QComboBox */
        border-bottom-right-radius: 3px;
    }
    
    QDateEdit::down-arrow {
        image: url(:/style/blue/xiaoxi/xiaoxi_icon_calendar_n.png);
    }
    
    QDateEdit::down-arrow:on { /* shift the arrow when popup is open */
        top: 1px;
        left: 1px;
    }

    转载请保存原文出处,谢谢!

  • 相关阅读:
    ASP.NET
    jquery
    rowcommand事件中获取控件
    Net 自定义Excel模板导出数据
    代码阅读方法与实践---阅读笔记06
    代码阅读方法与实践---阅读笔记05
    代码阅读方法与实践---阅读笔记04
    软件需求十步走---阅读笔记03
    软件需求十步走---阅读笔记02
    软件需求十步走---阅读笔记01
  • 原文地址:https://www.cnblogs.com/qnkk123/p/7685246.html
Copyright © 2011-2022 走看看