我通过继承QLineEdit和QCalendar创建了日期输入。当接收到mousePressEvent时,日历将显示在QLineEdit的底部。问题在于隐藏该日历。我已经覆盖了focusOutEvent,因为当用户点击其他地方时我希望它被关闭。但是这个事件根本没有收到,我通过在其中设置一个断点来证实这一点,它永远不会停在那里。我打电话给close()
:
class MyCalendarWidget : public QCalendarWidget
{
Q_OBJECT
public:
void focusOutEvent(QFocusEvent* e)
{
close();
}
};
当我从DateLineEdit关闭它时,它按预期工作:
void DateLineEdit::mousePressEvent(QMouseEvent *)
{
if (calendar->isVisible())
{
calendar->close();
}
else
{
calendar->move(mapToGlobal(QPoint(0, height())));
calendar->show();
}
}
答案 0 :(得分:1)
我猜它没有发送一个focusOutEvent,因为它从来没有关注过焦点;当然,如果用户随后在DateLineEdit中输入了某些内容。从DateLineEdit对象捕获focusOutEvent,并在该点关闭日历;虽然也许您想测试用户是否点击了日历(在这种情况下它会有焦点或者至少已经收到了一个mousePressEvent)并在这种情况下将其保留(但是否则将其关闭)。
答案 1 :(得分:1)
你知道Qt中已有这样的东西吗?请参阅setCalendarPopup()& QDateTimeEdit类的setCalendarWidget()。我现在唯一的区别是,要查看用户必须单击小部件右侧而不是编辑行的日历。
希望这有帮助