2011-04-01 87 views
0

我已经创建了一个日期输入的子类化QLineEdit和QCalendar。当接收到mousePressEvent时,日历显示在QLineEdit的底部。问题在于隐藏该日历。我已经重写了focusOutEvent,因为当用户点击其他地方时,我想让它关闭。但是这个事件根本没有收到,我通过在其中放置一个断点来证实这一点,它从来没有停止过。我已经把调用close()它:QWidget focusOutEvent没有收到

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

回答

1

我猜它不发送focusOutEvent因为它从来没有首先关注焦点;如果用户随后在DateLineEdit中输入了某些内容,肯定不会。从DateLineEdit对象中捕获focusOutEvent,并在该点关闭日历;虽然也许你会想测试用户是否点击了日历(在这种情况下,它会有焦点,或者至少已经收到了一个mousePressEvent),并在这种情况下保留它(但否则关闭它)。

+0

就是这样,谢谢。 – 2011-04-07 16:49:19

1

你是否知道Qt中已经有这样的东西?请参阅QDateTimeEdit类的setCalendarPopup() & setCalendarWidget()。我现在唯一的区别是,要查看日历,用户将不得不点击小部件的右侧,而不是编辑线。

希望这会有所帮助

+0

很高兴知道:) – 2011-04-07 16:50:14