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.事件过滤处理
扫描二维码关注公众号,回复:
12657212 查看本文章

//事件过滤
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);
}