2012-01-16 10 views
14

私がメインのこのような(と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はそれがのMainWinとの通信を開始することができたときに知っておく必要があります前に作成されます。この他のスレッド。しかし、mainWinはQtシグナル、スロット、タイマーなどを使用しているので、イベントループが実行されるまで(exec()を介して)本当にロックする準備はできていません。

私の質問です:イベントループが開始されたときに放出されるシグナルまたはイベントがありますか?

これを考慮してください。 mainWin.Init()では、QTimerのようなものを作成し、起動するために.start()を呼び出すことさえできます。しかし、実際には実行されず、exec()が呼び出されるまでイベントがトリガーされます。このため、イベントループが本当に始まったかどうかを知る必要があります。

+0

あなたのスレッドはQtスレッドかネイティブですか? – UmNyobe

答えて

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

2

イベントループがまだ実行されていないときに放出されたシグナルが失われることはないため、スレッドはウィンドウの準備ができていることを必ずしも知る必要はありません。
スレッドが信号を送信し始める可能性があります。ウィンドウはすぐに表示されますが、イベントループが実行されているときには、からまでの信号しか受信されません。

関連する問題