2014-07-25 31 views
0

我只有一個QMainWindow與mainwindow.ui,我有表,按鈕等... 從一個按鈕,我想動態創建小部件,並設置一個evenFilter它。如何在動態創建的QWidget上安裝eventFilter?

QWidget dialog = new QWidget(); 
dialog->installEventFilter(this); 

當我編譯程序它說,QObject::installEventFilter(): Cannot filter events for objects in a different thread.

我怎麼能添加這個小部件與其他的QObject線程或什麼是解決這個問題最好的解決辦法?

+2

QWidget是否屬於特定的QThread(非主)? – duDE

+0

QWidget未被我設置爲另一個線程。它只是在mainwindow.cpp中創建的,而不是與ui中的設計器一起作爲其他對象ui-> tableView ..etc –

+0

您是否在其他線程中有其他QObject?所有的小部件應該在主線程中,你可以使用QObject :: moveToThread來設置特定QObject的線程(主線程可以被QApplication :: instance() - > thread()接收),但是最好是創建所有的您的小部件直接在ui線程中。 – nikitoz

回答

0

您不應該從非gui線程創建gui窗口小部件。

創建QWidget的子類,並在那裏安裝eventFilter,放入信號返回結果。

而不是發送信號從你的線程主線程插槽創建這個QWidget dialog = new MyWidget()和使用你想要的。

+0

你能給我一些關於這個的博客嗎?我不明白爲什麼這麼簡單的事情很複雜 –

+0

我不知道博客的答案。但請記住,您無法直接訪問其他線程的窗口小部件和對象。唯一的方法是使用信號插槽。 – IGHOR

相關問題