2012-01-16 80 views
14

我有這樣的main()的Qt應用程序...Qt:事件循環開始時是否有通知?

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    MainWindow mainWin; 

    ... A separate, non-GUI thread is launched here 

    mainWin.Init(); 
    mainWin.show(); 

    app.exec(); 
} 

之前,孟文需要知道什麼時候可以開始與孟文通信所創建的這個其他線程。但是,由於mainWin使用Qt信號,插槽,定時器等,所以在事件循環運行之前(通過exec())它並沒有真正做好準備。

我的問題是:是否有一些信號或事件是在事件循環開始時發出的?

請考慮這一點。在mainWin.Init()中,你可以創建類似QTimer的東西,甚至可以調用.start()來啓動它。但它不會實際運行並觸發事件,直到調用exec()。這就是爲什麼我需要知道事件循環何時真正開始。

+0

你的線程是Qt線程還是native? – UmNyobe 2012-01-16 09:25:24

回答

9

您可以將exec()調用之前將信號發送到你的窗口。這會在app的信號隊列中輸入一個條目。 當exec()正在運行時,信號將被傳遞,您的窗口將知道事件循環正在運行。

一個簡單的方法是使用QTimer::singleShot(0, &mainWin, SLOT(onEventLoopStarted()));連接到您的窗口類的自定義插槽。

1

你可以做以下順序:

QApplication app(argc, argv); 
Mainwinwdow mainWin; 
QThread yourThread; 

//connect the signals from the thread to the mainWin here 

mainWin.Init(); 
mainWin.show(); 

yourThread.start(); 

return app.exec(); 
+1

僅供參考,這似乎不適用於PyQt。在調用app.exec_()之前以某種方式發送和處理信號。 – orodbhen 2016-03-16 21:12:01

2

由於當事件循環尚未運行時發出的信號不會丟失,因此您的線程可能不一定需要知道您的窗口準備就緒。
你的線程可以立即開始發送信號窗口,但它只會在事件循環運行時從窗口接收信號,從