PyQt:为啥弹出对话框会阻止其他代码的执行?
Posted
技术标签:
【中文标题】PyQt:为啥弹出对话框会阻止其他代码的执行?【英文标题】:PyQt:Why a popup dialog prevents execution of other code?PyQt:为什么弹出对话框会阻止其他代码的执行? 【发布时间】:2011-12-11 11:53:11 【问题描述】:I am having a little problem with a pop up dialog.I have a combobox,which when the option changes it pops up a dialog with a textedit widget,do some stuff and insert some text in the textedit widget.
这是我用于弹出窗口的内容:
def function_1(self):
dialog = QDialog()
dialog.ui = Ui_Dialog_popup()
dialog.ui.setupUi(dialog)
dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose)
dialog.exec_()
我将 QtDesignere 中的弹出 gui 代码放在一个单独的 py 文件中。
弹出对话框出现,但如果对话框没有关闭,则不能执行其他任何操作。你知道我该如何处理吗?谢谢。
【问题讨论】:
【参考方案1】:这正是QDialog
的exec
方法设计的用途:模态对话框。阅读“模态”和“无模态对话框”部分。
如果您没有阻止主 UI 的对话框,请调用 show()
而不是 exec()
(并查看 modal
属性文档)。
【讨论】:
所以使用模态你不能与主应用程序交互,而使用非模态你可以。我用 show() 替换了 exec() 但弹出窗口会在几秒钟内出现和消失,我还需要改变什么?谢谢。 只要您需要,您就需要该对象保持活动状态。它可能需要成为您班级的成员。我猜当函数在你的代码中返回时它会被破坏(但我对 python 不是很熟悉)。【参考方案2】:详细说明 Mat 所说的:show() 函数立即返回,并且由于对话框是该函数的本地,因此一旦“function_1”返回,对象就会被删除。您可能希望将对话框设置为成员或全局(根据您的要求),以便对象保留在内存中。
HTH
【讨论】:
我选择了全局选项,它起作用了。一个问题是对话框的窗口出现了,然后连接到组合框的下一个函数执行,然后弹出对话框中的小部件出现。【参考方案3】:由于您正在设置 WA_DeleteOnClose
窗口属性,我假设您希望在每次调用 function_1
方法时创建一个新对话框(这可能是个好主意)。
如果是这样,解决您的问题的最简单方法(基于您提供的代码)是为您的对话框提供父级(使其保持活动状态),然后使用 show()
显示它modelessly :
def function_1(self):
dialog = QDialog(self)
dialog.ui = Ui_Dialog_popup()
dialog.ui.setupUi(dialog)
dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose)
dialog.show()
【讨论】:
以上是关于PyQt:为啥弹出对话框会阻止其他代码的执行?的主要内容,如果未能解决你的问题,请参考以下文章
win7弹出的消息被其他页面遮挡,怎样让弹出的对话框显示在最上面一层?
android中PopupWindow弹出窗体后,为啥不能点击其他控件