0

我通过子类化 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();
    }
}
4

2 回答 2

1

我猜它没有发送focusOutEvent,因为它一开始就没有焦点;如果用户随后在 DateLineEdit 中键入内容,则肯定不会。从 DateLineEdit 对象中捕获 focusOutEvent,并在该点关闭日历;尽管您可能想测试用户是否单击了日历(在这种情况下它会获得焦点或至少收到 mousePressEvent)并在这种情况下将其保留(但否则关闭它)。

于 2011-04-02T00:42:45.623 回答
1

你知道Qt中已经有这样的东西了吗?请参阅 QDateTimeEdit 类的setCalendarPopup()setCalendarWidget()。我现在唯一能想到的区别是,要查看日历,用户必须单击小部件的右侧,而不是编辑行。

希望这可以帮助

于 2011-04-02T12:15:12.500 回答