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

时间:2016-01-06 19:40:37

标签: pyqt pyqt4 python-3.4

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

  • 它有“是”,“否”按钮以及“保存新设置”复选框项目
  • 当我点击时,对话框应关闭主程序
  • 当我点击时,对话框应该返回主程序

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

app.setQuitOnLastWindowClosed(False)

但在这种情况下,主窗口被隐藏,程序被“卡住” 这是代码。

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)

并在MainWindow中

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())

我做错了什么?

2 个答案:

答案 0 :(得分:1)

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

添加 event.ignore()解决了这个问题。任何人都可以解释,为什么? CloseEvent被覆盖,不应该接受事件,是吗?

答案 1 :(得分:1)

您应添加event.ignore()的原因是默认情况下接受所有QEvent(也意味着您不需要致电event.accept()):doc