大きな計算を実行するQThreadベースのコードを書きました。進行状況を視覚化するには、QProgressDialogを開く必要があります。ダイアログは、計算中にメインウィンドウの変更を許可したくないので、アプリケーションモーダル(open()を使用)です。スレッドは、GUIとスレッドとの間のステートマシンベースの通信を可能にする様々な信号を発信する。Modal QProgressDialog :: setValue()はネストされたイベントループによってクラッシュする
スレッドのワーカーオブジェクトによって生成された2つの信号は、「進捗状況」と「終了済み」です。 "Progress"が発生した場合は、setValue()を使用してQProgressDialogを更新しています。 「Finished」が発行された場合、ダイアログは破棄されます。
- が
- のsetValue(100)直後に放出される "終了" 放出される "進行" イベント(100%)と呼ばれている起因する:
以下は計算の終了時に起こります"進行" イベント
- ダイアログがモーダルであるためには、setValueのは()のprocessEventsを()
- のprocessEvents() "完了" イベントを提供して呼び出す
- 「完了」イベントは、ダイアログがクラッシュ
QProgressDialogはsetValueの中で()のprocessEventsを呼び出すことで、私のアーキテクチャを壊すの()を引き起こすのsetValueの真ん中 ()で破壊されます。また、私のコーディング規則は、ネストされたイベントループ(exec()などのような)の使用を禁止しています。
はなぜモーダルダイアログは、ネストされたイベントループを必要としない:
私は2つの質問がありますか?親のウィンドウの入力を阻む私の邪魔にならないものから、これを必要としないようです。
QProgressDialogはモーダルな方法で使用できますが、ネストされたイベントループはありませんか?
ダイアログを「破壊する」のはどうですか?あなたは 'deleteLater()'を使っていますか? – Mike
質問のタイトルがあなたの実際の番号付き質問と一致しません。それらを同じにしてください。 – xaxxon
@Mike:削除を利用します。おそらくdeleteLaterが回避策ですが、私はできるだけ早くこれを試していきます。 – Silicomancer