QMessageBoxはQDialogをブロックします
-
28-10-2019 - |
質問
今回は質問の作り方がよくわかりません...
メインウィンドウとしてQDialogを使用したアプリケーションがあります。 アプリケーションは、リモートマシンから温度、湿度などのさまざまな値を取得しています。
開発のために、これらの値をシミュレートするために、さまざまなウィジェットを備えたグループボックスを追加しました。ユーザーに警告とアラームをスローするためのさまざまな制限があります。
たとえば、温度が30°Cを超えて上昇した場合、要求時間(アプリケーションはリモートマシンでポーリングを実行します)と現在の温度でQMessageBoxを開きます。したがって、これはリクエストサイクルごとに更新されます。
show()メソッドを使用して、アプリケーションをバックグラウンドで実行し続けるメッセージボックスを表示します。現在の問題は、フォーカスがメッセージボックスにあり、メインウィンドウの何も表示されない/メッセージボックスが受け入れられない/終了するまでQDialogをクリックできないことです。
それが私の問題です。シミュレーションモードでは、メインウィンドウのスライダーで調整できるさまざまな温度値を試してみたいと思います。これらのウィジェットにアクセスしたり、メッセージボックスを何らかの方法で「ブロックしない」ようにするにはどうすればよいですか?
よろしくお願いします
マティアス
解決
あなたが経験していることは、ウィンドウの「モダリティ」と呼ばれます。デフォルトでは、QMessageBox
は「アプリケーションモーダル」です。これは、他のすべてのアプリケーションウィンドウへの入力がブロックされることを意味します。
モダリティを変更するには、値を指定して setWindowModality()を使用しますshow()
を呼び出す直前に、 Qt :: WindowModality から。あなたの場合:
ジェネラコディセタグプレ
他のヒント
実際、QMessageBoxの動作方法であるモーダルメッセージボックスがあります。つまり、ユーザーに警告が表示され、ユーザーがメッセージを登録してメッセージボックスを閉じ、(もしあれば)まで、UIはそれ以上の操作から保護されます。必要)メッセージに応じて必要なアクションを実行しました。
メッセージボックスのモダリティをQt :: NonModalに設定すると(メッセージボックスをポップアップした後、アプリケーションが続行してもスコープ外にならない変数に割り当てることを忘れないでください)、対話できるようになります。メッセージボックスが表示されている間でもUIを使用します。私が言わなければならないのは「異常」です。私があなたの要件を理解しているなら、あなたはすでにメッセージボックスを開いているでしょう-それからこれがまだ上がっている間に、あなたはメインウィンドウで異なる温度値で遊んでみたいでしょう-どのような効果がありますか?別のメッセージダイアログボックスが表示されるまで?メッセージボックスは、ある時点で破棄する必要があります。
それだけでなく、非モーダルメッセージボックスを表示してからメインウィンドウを操作すると、メッセージボックスがメインウィンドウの後ろに表示されなくなり、とにかく見えなくなる可能性があります。
メッセージボックスは通常、意図したとおりに扱われることをお勧めします。一時的な一時的なモーダルアラートボックスのみであり、非モーダルQMessageBoxを使用するのではなく、メインウィンドウに明確に表示されるライブレポート/ステータス領域が必要な場合があります。
これがお役に立てば幸いです
よろしく
ロジャー