QDateEdit 显示日历控件,居中点击,显示日历控件

QDateEdit 要显示日历控件需要先设置显示日历下拉

调用 setCalendarPopup(true);

点击右边的向下箭头就可以显示日历

【扩展】

如果想要点击QDateEdit 中间的日期文本,就显示日历,可以使用事件过滤的方式

1.先获取QLineEdit

        for(auto lineEdit:dateEdit->findChildren<QLineEdit*>())
        {
            if(lineEdit)
            {
                if(lineEdit->objectName() == "qt_spinbox_lineedit")//找到QLineEdit
                {
                    lineEdit->setReadOnly(true);//只读
                    lineEdit->setAlignment(Qt::AlignCenter);//居中
                    connect(lineEdit,&QLineEdit::selectionChanged,[=]{
                        lineEdit->deselect();
                    });//不让选中
                    lineEdit->installEventFilter(this);//事件过滤
                }
                break;
            }
        }
        dateEdit->installEventFilter(this);

2.事件过滤处理


//事件过滤
bool pmInformation::eventFilter(QObject *target, QEvent *event)
{
    static QTime timer =QTime::currentTime();
    static QDateEdit*  curDateEdit = 0;
    if(QString(target->metaObject()->className()) == "QDateEdit")
    {
        QDateEdit*  dateEdit =qobject_cast<QDateEdit*>(target);
        if (event->type() == QEvent::FocusIn)
            {
                curDateEdit = dateEdit;
                if(dateEdit->calendarWidget()->isVisible())
                    timer=QTime::currentTime();   //用于判断收起还是显示
            }
            else if (event->type() == QEvent::FocusOut)
            {
                curDateEdit = 0;
            }
            else  if (event->type() == QEvent::MouseButtonPress
                     || event->type() == QEvent::MouseButtonDblClick
                     || event->type() == QEvent::TouchBegin)
            {
                int msecs = timer.msecsTo(QTime::currentTime());
                if(curDateEdit)
                {
                    QSize sz =  curDateEdit->geometry().size()-=QSize(5,5);
                    QPoint pt(sz.width(),sz.height());
                    if(msecs > 50)
                    {
                        bool bPress = true;
                        if(event->type() == QEvent::MouseButtonPress)
                        {
                            QMouseEvent * pEvt = (QMouseEvent * )(event);
                            if(pEvt&& pEvt->pos() == pt)
                            {
                                bPress = false;
                            }
                        }
                        if(bPress)
                        {
                            timer=QTime::currentTime();
                            QMouseEvent evt(QEvent::MouseButtonPress,pt,Qt::LeftButton,Qt::LeftButton,Qt::NoModifier);
                            qApp->sendEvent(curDateEdit,&evt);
                            return true;
                        }
                    }
                    else
                    {
                        if(event->type() == QEvent::MouseButtonPress)
                        {
                            QMouseEvent * pEvt = (QMouseEvent * )(event);
                            if(pEvt&& pEvt->pos() != pt)
                            {
                                return true;
                            }
                            else
                            {
                                return QWidget::eventFilter(target, event);
                            }
                        }
                    }
                }
            }
        }
    }
    else if(QString(target->metaObject()->className()) == "QLineEdit")
    {
        if (event->type() == QEvent::MouseButtonPress
            || event->type() == QEvent::MouseButtonDblClick
            || event->type() == QEvent::TouchBegin)
        {
            if(curDateEdit &&  curDateEdit->isEnabled())
            {
                int msecs = timer.msecsTo(QTime::currentTime());
                if(msecs > 50)//小于50.表示原来已经显示,现在需要收起来。大于50.才是显示日历控件
                {
                    //发送鼠标左键事件,坐标在向下箭头的位置
                    QSize sz =  curDateEdit->geometry().size()-=QSize(5,5);
                    QPoint pt(sz.width(),sz.height());
                    QMouseEvent evt(QEvent::MouseButtonPress,pt,Qt::LeftButton,Qt::LeftButton,Qt::NoModifier);
                    qApp->sendEvent( curDateEdit,&evt);
                }
            }
            return true;
        }
    }
    return QWidget::eventFilter(target, event);
}

猜你喜欢

转载自blog.csdn.net/hss2799/article/details/109444920