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);
}

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值