【问题标题】:PyQt dialog closes entire app on exitPyQt 对话框在退出时关闭整个应用程序
【发布时间】:2013-03-15 13:13:54
【问题描述】:

我有一个 PyQt 向导,其中包含一个询问用户问题的对话框。此对话框是可选的,仅在用户需要时使用。按钮发送应用程序接收并打开窗口的信号。我遇到的问题是,当对话框关闭时,它会关闭整个应用程序。如何确保对话框关闭时,主应用程序保持打开并运行?这里是处理对话框的代码:

def new_item(self):
    app = QtGui.QApplication(sys.argv)
    Dialog = QtGui.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.exec_()

我尝试添加一个“取消”按钮来手动关闭它,但结果是一样的,整个应用程序都关闭了。

QtCore.QObject.connect(self.cancel, QtCore.SIGNAL(_fromUtf8("clicked()")), Dialog.close)

【问题讨论】:

  • 为什么要创建app
  • 啊哈,我删除了app,它工作正常。我从 pyuic 返回的文件中得到了代码。

标签: python pyqt pyqt4


【解决方案1】:

您不应该在代码中创建新的 QApplication 对象,我对销毁该对象会关闭应用程序并不感到惊讶。

【讨论】:

    【解决方案2】:

    您的代码应如下所示:

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    from PyQt4 import QtGui, QtCore
    
    class MyWindow(QtGui.QWidget):
        def __init__(self, parent=None):
            super(MyWindow, self).__init__(parent)
    
            self.dialog = QtGui.QMessageBox(self)
            self.dialog.setStandardButtons(QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel)
            self.dialog.setIcon(QtGui.QMessageBox.Question)
            self.dialog.setText("Click on a button to continue.")
    
            self.pushButtonQuestion = QtGui.QPushButton(self)
            self.pushButtonQuestion.setText("Open a Dialog!")
            self.pushButtonQuestion.clicked.connect(self.on_pushButtonQuestion_clicked)
    
            self.layoutHorizontal = QtGui.QHBoxLayout(self)
            self.layoutHorizontal.addWidget(self.pushButtonQuestion)
    
        @QtCore.pyqtSlot()
        def on_pushButtonQuestion_clicked(self):
            result = self.dialog.exec_()
    
            if result == QtGui.QMessageBox.Ok:
                print "Dialog was accepted."
    
            elif result == QtGui.QMessageBox.Cancel:
                print "Dialog was rejected."
    
    if __name__ == "__main__":
        import sys
    
        app = QtGui.QApplication(sys.argv)
        app.setApplicationName('MyWindow')
    
        main = MyWindow()
        main.show()
    
        sys.exit(app.exec_())
    

    【讨论】:

      【解决方案3】:

      尝试使用Dialog.reject 而不是Dialog.close

      .close() 方法与 QMainWindow Widget 一起使用,.reject() 与 QDialog 一起使用。

      【讨论】:

        【解决方案4】:

        就我而言,我将QSystemTrayIcon 作为我的应用程序的“入口点”,而不是QMainWindowQWidget

        在我的主要QApplication 实例上调用.setQuitOnLastWindowClosed(False) 有帮助,感谢this answer

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多