OSX El Capitan上的PyQt4 / 5
我有一个QMessageBox / QDialog,我希望它是模态的,并希望在进程运行时阻止来自其他GUI项的输入。 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 :(得分:0)
好的,我找到了一种解决方法,虽然我认为这不是一个优雅的解决方案。
如果我使用以下方法将窗口模态设置为'window modal'而不是'application modal':
self.openingDialog.setWindowModality(QtCore.Qt.WindowModal)
然后,在程序关闭对话框后,应用程序重新获得焦点和可访问性。 当对话框是应用程序模式时,这仍然无法解决问题,但现在这符合我的需求。