PyQt对话框在退出时关闭整个应用程序

3

我有一个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)

3
你为什么要创建应用程序(app)? - wRAR
啊哈,我移除了app,现在它可以正常工作了。我从pyuic返回的文件中获得了这段代码。 - Son of a Sailor
4个回答

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

0
尝试使用Dialog.reject而不是Dialog.close 在QMainWindow小部件中使用.close()方法,在QDialog中使用.reject()方法。

0
在我的情况下,我将QSystemTrayIcon作为我的应用程序的“入口点”,而不是QMainWindowQWidget
在我的主QApplication实例上调用.setQuitOnLastWindowClosed(False)有所帮助,感谢this answer

0

你的代码应该长这样:

#!/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_())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接