PyQt 中的自定义退出提示对话框

Custom exit prompt dialog in PyQt

我正在尝试创建自定义退出提示对话框,它应该执行以下操作:

所以,没什么特别的,但是当我单击 时,它会关闭主程序。
我试过使用

app.setQuitOnLastWindowClosed(False)

但在这种情况下,主要 window 被隐藏,程序是 "stuck"。
这是代码。

class AreYouSure(QtGui.QDialog):

    saved = QtCore.pyqtSignal()

    def __init__(self):
        super(AreYouSure, self).__init__()
        self.initUI()
        self.retranslateUI()
        self.initActions()

    def initUI(self):
        layout = QtGui.QVBoxLayout()
        hor_lay = QtGui.QHBoxLayout()
        self.label = QtGui.QLabel()
        self.check_item = QtGui.QCheckBox()
        self.yes = QtGui.QPushButton()
        self.no = QtGui.QPushButton()
        hor_lay.addWidget(self.yes)
        hor_lay.addWidget(self.no)
        layout.addWidget(self.check_item)
        layout.addWidget(self.label)
        layout.addLayout(hor_lay)
        self.setLayout(layout)

    def retranslateUI(self):
        self.setWindowTitle("Exit")
        self.label.setText("Are you sure to quit?")
        self.yes.setText("Yes")
        self.no.setText("No")
        self.check_item.setText("Save e-mail/password")

    def exit(self):
        if self.check_item.isChecked():
            self.saved.emit()
        QtGui.QApplication.quit()

    def initActions(self):
        self.yes.clicked.connect(self.exit)
        self.no.clicked.connect(self.close)

并在主窗口中

def closeEvent(self, event):
        a = AreYouSure()
        a.saved.connect(self.saveDefaults)
        a.exec_()

def saveDefaults(self):
        '''save default email and password'''
        self.settings = QtCore.QSettings(DEFAULT_NAME, QtCore.QSettings.IniFormat)
        self.settings.setValue("email", self.email_edit.text())
        self.settings.setValue("password", self.pass_edit.text())

我做错了什么?

def closeEvent(self, event):
        a = AreYouSure()
        a.saved.connect(self.saveDefaults)
        a.exec_()
        event.ignore()

添加 event.ignore() 解决了问题。谁能解释一下,为什么?
CloseEvent 被覆盖,不应接受事件,对吗?

你应该添加event.ignore()的原因是默认接受所有QEvent(也意味着你不需要调用event.accept()):doc