阻止和隐藏 QDialog:exec_() 的替代方案?

Posted

技术标签:

【中文标题】阻止和隐藏 QDialog:exec_() 的替代方案?【英文标题】:Block and hide QDialog: Alternative to exec_()? 【发布时间】:2011-11-30 00:32:06 【问题描述】:

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

class ModelDialog(QtGui.QDialog):
    ...

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

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

根据Qt docs 和PyQt docs,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 docs 预期的)

【问题讨论】:

【参考方案1】:

使用app.exec_() 代替dialog.exec_()

【讨论】:

以上是关于阻止和隐藏 QDialog:exec_() 的替代方案?的主要内容,如果未能解决你的问题,请参考以下文章

带有隐藏和 WA_QuitOnClose 的 Qt QDialog

QT Qdialog

PyQt - 隐藏 MainWindow 并显示 QDialog 而不会消失任务栏图标

Qt编程求助:有没有啥类似QDialog::exec()之类的能阻塞程序的方法?

在 QDialog::exec() 期间使用 QThreads 执行 QWidget::grab()

让 QDialog 与 show 或 exec 函数一起显示