阻止并隐藏QDialog: exec_()的替代方法?

1 投票
1 回答
2376 浏览
提问于 2025-04-17 07:21

在我的基于Qt的应用程序中(使用PyQt 4.8.6构建),我有一个类,它是QtGui.QDialog的子类:

class ModelDialog(QtGui.QDialog):
    ...

当我运行应用程序的用户界面时,我可以这样显示QDialog:

def main():
    app = QtGui.QApplication(sys.argv)
    dialog = ModelDialog()
    dialog.exec_()

根据Qt文档PyQt文档exec_()是一个阻塞函数,这意味着在调用这个QDialog时,它会默认变成一个模态窗口(模态窗口的意思是用户不能与应用程序中的其他窗口进行交互)。在正常情况下,这正是发生的情况。

不过,最近我一直在尝试一种方法,通过使用所有输入值的默认设置来调用整个QApplication,而不询问用户任何输入。应用程序的行为如预期一样,除了一个方面:调用dialog.exec_()会导致模态对话框显示出来。

我找到的唯一解决办法是捕获showEvent函数,然后迅速隐藏窗口,但这仍然会让QDialog对象在一瞬间显示出来:

class ModelDialog(QtGui.QDialog):
    ...
    def showEvent(self, data=None):
        self.hide()

有没有办法完全防止模态窗口显示,同时继续阻塞主事件循环?我希望能有类似这样的东西:

def main():
    app = QtGui.QApplication(sys.argv)
    dialog = ModelDialog()
    dialog.setHideNoMatterWhat(True)
    dialog.exec_()

(为此,我尝试使用QWidget.setVisible(False),但dialog.exec_()仍然会让对话框可见,这也是根据Qt文档的预期行为)

1 个回答

2

app.exec_() 来代替 dialog.exec_()

撰写回答