PyQt:为何弹出对话框会阻止其他代码执行?

2 投票
3 回答
4151 浏览
提问于 2025-04-17 08:09

我遇到了一个小问题,关于弹出对话框。我有一个下拉框,当选择的选项改变时,它会弹出一个对话框,里面有一个文本编辑框,我会在里面做一些操作并插入一些文本。

这是我用来弹出对话框的代码:

def function_1(self):
    dialog = QDialog()
    dialog.ui = Ui_Dialog_popup()
    dialog.ui.setupUi(dialog)
    dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose)
    dialog.exec_()

我在QtDesigner中制作了弹出窗口的界面代码,并放在一个单独的.py文件里。

弹出对话框是能显示出来的,但如果不关闭这个对话框,后面的代码就无法执行。你知道我该怎么处理这个问题吗?谢谢。

3 个回答

0

因为你设置了 WA_DeleteOnClose 这个窗口属性,我猜测你是想每次调用 function_1 方法的时候都创建一个新的对话框(这可能是个好主意)。

如果是这样,解决你问题的最简单方法(根据你提供的代码)就是给你的对话框指定一个父窗口(这样它就能保持活着),然后使用 show() 方法以 无模式 的方式显示它:

def function_1(self):
    dialog = QDialog(self)
    dialog.ui = Ui_Dialog_popup()
    dialog.ui.setupUi(dialog)
    dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose)
    dialog.show()
1

进一步解释一下Mat说的内容:show()这个函数会立刻返回,而dialog是这个函数内部的一个局部变量,所以当"function_1"这个函数结束时,dialog这个对象就会被删除。你可能想把dialog设置成一个成员变量或者全局变量(根据你的需求来选择),这样这个对象就能一直保留在内存中。

希望这对你有帮助!

5

这正是QDialogexec方法的用途:用于模态对话框。你可以看看“模态”和“非模态对话框”这两个部分。

如果你不想让这个对话框阻塞你的主界面,可以使用show()来代替exec()(同时查看一下modal属性的相关文档)。

撰写回答