2016-05-04 4 views
0

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を閉じて間違っていますか?

+0

ダイアログのキャンセルボタンは正常に機能しますか?最後の4行を取り除き、ダイアログを 'hide()'するだけでどうなるでしょうか?また、それは問題を引き起こしているダイアログだけであることを確認しましたか? – ekhumoro

+0

はい、キャンセルを押すと、インターフェイスを制御できるようになります。ダイアログを完全に終了すると、アプリは必要に応じて機能します。 hide()は、コントロールがGUIに返されないという点でclose()と同じ効果を持ちます。 –

+0

さて、最後の4行を 'reject()'に置き換えてみてください。 – ekhumoro

答えて

0

[OK]を私はそれがエレガントなソリューションだとは思わないが、回避策の一種を見つけました。

私が使用して代わりに「アプリケーションモーダル」のウィンドウのモーダル 'にウィンドウモダリティを設定した場合:

self.openingDialog.setWindowModality(QtCore.Qt.WindowModal) 

をそのアプリケーションは、ダイアログがプログラムによって閉じられた後に焦点を当てるとアクセシビリティ取り戻します。 これは、ダイアログがアプリケーションモーダルである場合でも問題は解決しませんが、今のところこれが私のニーズに役立ちます。

+0

今*興味深いです。私よりも賢明な人は、これをバグレポートを必要とするエッジケースとみなすかもしれません。 –

+0

それは私が思ったものです!私は本当にこれがバグだと言っても賢明ではないと思うが、意図しない振る舞いのように思える。 –

関連する問題