2013-07-30 39 views
3

我包括#include <QFocusEvent>到我的代碼和實施focusOutEvent如下:focusOutEvent不叫

void MyWidget::focusOutEvent(QFocusEvent *e) 
{ 
    if(e->type() == QEvent::FocusOut) 
    { 
    fprintf(stderr, "hello"); 
    } 

} 

微件描述符具有以下額外的線路:

installEventFilter(this); 
    setFocusPolicy(Qt::WheelFocus); 

我也有頭文件定義如下:

virtual void focusOutEvent(QFocusEvent * event); 

問題是,無論我做什麼(標籤或者在其他地方點擊)不會調用這個焦點事件。我該如何解決這個問題?

+0

'installEventFilter(本);'應被刪除。通常不需要爲同一對象添加事件過濾器對象。如果事件在'eventFilter'方法實現中被過濾(如果有的話),它也可能是麻煩的原因。 –

+0

刪除了'installEventFilter',但沒有更改。 – www

回答

2

可能是它不叫,因爲它沒有匹配的QWidget到declarion

virtual **protected** void QWidget::focusOutEvent (QFocusEvent * event) 

還你不能嘗試調用setMouseTracking(true)(文件建立說,在這個沒有必要,但可能這可以幫助)和可以調用原始事件處理程序
可以指定你正在運行的操作系統嗎?

+0

我會盡力讓你知道。我正在使用openSuse – www

0

檢查是否MyWidget顯示在模式方式(模態:你不能與父窗口部件交互)。

如果是這樣,那麼MyWidget總是在焦點時,其父母對焦(我猜)。

你可以做什麼不模式方式(撥打show()而不是exec()

顯示它或者你可以把它的頂層窗口小部件(無父)。

3

對我來說,訣竅是爲了強調對話的焦點。 即:

QDialog *dialog = new QDialog(); 
... 
dialog->show(); 
dialog->raise();  // to make sure it's shown on top 
dialog->setFocus(); 

我原本認爲是應該將焦點設置對話框一樣的一個dialog->activateWindow(),但setFocus()似乎得到更好地完成工作。

然後我重新實現的focusOutEvent()當我點擊對話框外的任何地方時被調用。

注:這是使用Qt 5.7.1在Fedora 25(KDE自旋)測試