2

次のシナリオでは、競合状態を回避しようとしています。

QDialog* dialog = [...];
QThread* thread = [...];

connect(thread, SIGNAL(finished()), dialog, SLOT(accept()));

thread->start();
dialog->exec();

QDialog :: exec()がダイアログを設定する前にスレッドが終了すると、シグナルによってトリガーされた「accept()」呼び出しは失われ、ダイアログは自動的に閉じません...

したがって、理想的には、ダイアログがスレッドを処理する準備ができた後でのみスレッドを開始したいのですが、これをどのように行うのでしょうか?

4

2 に答える 2

3

秘訣は、ダイアログがすでに表示されている場合にのみスレッドを開始する必要があるということです。したがって、QDialogのshowEventが発生したら、開始する必要があります。
まず、showEventをキャプチャする必要があります。これは、QObject::installEventFilterとを使用するか、オーバーライドQObject::eventFilterをサブクラス化することで実行できます。 それが済んだら、スレッドに開始を通知します。ショーイベントをキャプチャするために選択した方法に応じて、またはその方法で発信するカスタム信号が必要です。 ここで、その信号をスロットに接続するだけで完了です(編集:を使用)。 信号を2回 処理しないように注意してください。QDialogQWidget::showEvent
YourClass::eventFilterYourClass::showEvent
QThread::start()Qt::QueuedConnection

QDialog::accepted()

于 2011-01-27T14:05:27.167 に答える
0

Qtを使ってからしばらく経ちました。しかし、なぜQThreadを使用してダイアログからのAcceptクリックを処理するのですか?モーダルダイアログの場合はQDialog::r​​esult()を使用できます。または、スレッドからQDialog :: accepted()..にシグナルを転送できます。

于 2011-01-27T13:43:50.063 に答える