Events 未收到QWidget focusOutEvent

Events 未收到QWidget focusOutEvent,events,qt,qwidget,Events,Qt,Qwidget,我通过子类化QLineEdit和QCalendar创建了一个日期输入。当接收到mousePressEvent时,日历显示在QLineEdit的底部。问题在于隐藏日历。我已经覆盖了它的focusOutEvent,因为我希望当用户单击其他地方时它会被关闭。但这个事件根本没有被接收到,我通过在其中设置断点来确认这一点,它永远不会停止。我在其中调用了close(): class MyCalendarWidget : public QCalendarWidget { Q_OBJECT publi

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

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

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

希望这有帮助