5

Qt アプリケーションのメイン ウィンドウは通常のQMainWindowサブクラスです。そのウィンドウにはいくつかのボタンがあります。それぞれにclicked独自のスロットに接続された信号があり、各スロットは次のQDialogように異なるものを作成します。

void onButtonA_clicked()
{
    MyADialog* dialog = new MyADialog(this);
    dialog->exec();
    delete dialog;
}

私はこの記事を読んでいます: https://wiki.qt.io/Threads_Events_QObjects#Events_and_the_event_loopと著者は言います

イベントループを決してブロックしないでください

それは私を心配させました。execはブロッキング関数であるため、彼がそこで言っていることによると (彼の例でWorker::doWorkは多くの作業が行われ、完了するまでに時間がかかります)、私のコードはイベント ループをブロックしていますが、これを示唆するものは何も気づいていません。それどころか、メインウィンドウは正常に動作しているようで、メソッドを使用するようにコードを変更しても違いはありませんでしたshow()

イベントループをブロックしていますか? ここで別のアプローチを使用する必要がありますか?

4

1 に答える 1

10

QDialog::exec()はい、メインイベントループをブロックします。exec()ただし、ダイアログが開いている間にイベントを処理する内のローカル イベント ループを開くため、UI をブロックしません。これは厄介なバグの原因となる可能性があります: (ほとんど) 何かがexec()戻る前に発生する可能性があり、外部イベント (タイマー、ネットワーク、IPC など) がスロットを呼び出したり、他のダイアログが表示されたりする可能性があります。ほとんどのそのようなダイアログのモーダルな性質を考えると、直接的なことは通常制限されています。

可能性のある問題を認識し、呼び出し時にアプリケーションを一貫性のない状態のままにしexec()ないでください。また、その後の状態に依存しないでください。

または、ノンブロッキングQDialog::open()を呼び出してシグナルに接続しfinished()ます。

于 2015-11-09T10:12:22.703 に答える