PyQt4/5 OSXエルキャピタンQDialogをした後もマウス入力をブロックし続け近くに
私はモーダルになりたいと、プロセスの実行中に他のGUIアイテムからの入力をブロックするQMessageBox/QDialogを持っています。 QDialogは、上記のプロセスをキャンセルするオプションをユーザに提供するが、その間にGUIを使って何か他のことをすることはできない。
プロセスが終了したら、QDialogを閉じてメインアプリケーションへの入力を再度有効にする必要があります。ダイアログが表示されている間、バックグラウンドで状況が起こるはずなので、私はexec_()を使ってダイアログを表示していません。
は、ここに私のコードの簡単な例です:
self.openingDialog = QtWidgets.QMessageBox(self.main_window)
self.openingDialog.setText(_(u"Opening experiment. Please wait"))
self.openingDialog.setStandardButtons(QtWidgets.QMessageBox.Cancel)
self.openingDialog.reject.connect(<some_function>)
self.openingDialog.show()
self.openingDialog.raise_()
... [Perform process] ...
self.openingDialog.done(0)
self.openingDialog.close()
self.openingDialog.deleteLater()
すべては、ダイアログボックスが表示されるという意味ではうまく動作し、それが表示されている間に相互作用が他のGUI要素で可能ではないこと。ただし、処理が完了すると、ダイアログボックスは自動的に閉じられますが、その後も他のGUI要素と対話することはできません。 GUIはマウスのクリックに反応せず、メニュー項目にはアクセスできず、閉じるボタンをクリックすることもできないため、アプリケーションを強制終了する必要があります。
私は自動的にQDialogを閉じて間違っていますか?
ダイアログのキャンセルボタンは正常に機能しますか?最後の4行を取り除き、ダイアログを 'hide()'するだけでどうなるでしょうか?また、それは問題を引き起こしているダイアログだけであることを確認しましたか? – ekhumoro
はい、キャンセルを押すと、インターフェイスを制御できるようになります。ダイアログを完全に終了すると、アプリは必要に応じて機能します。 hide()は、コントロールがGUIに返されないという点でclose()と同じ効果を持ちます。 –
さて、最後の4行を 'reject()'に置き換えてみてください。 – ekhumoro