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】:

这正是QDialogexec 方法设计的用途:模态对话框。阅读“模态”和“无模态对话框”部分。

如果您没有阻止主 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:为啥弹出对话框会阻止其他代码的执行?的主要内容,如果未能解决你的问题,请参考以下文章

PyQt 无模式对话框不会显示

win7弹出的消息被其他页面遮挡,怎样让弹出的对话框显示在最上面一层?

PyQt5 笔记(03):弹出窗口大全

android中PopupWindow弹出窗体后,为啥不能点击其他控件

MFC为啥一关闭对话框就系统崩溃 弹出英语说某个地址不可写。。。?

手机浏览器会阻止弹出窗口,请问怎么取消?