PyQt 中的自定义退出提示对话框
Custom exit prompt dialog in PyQt
我正在尝试创建自定义退出提示对话框,它应该执行以下操作:
- 它有是、否按钮以及 "Save new settings" 复选框项目
- 当我点击是时,对话框应该关闭主程序
- 当我点击否时,对话框应该回到主程序
所以,没什么特别的,但是当我单击 否 时,它会关闭主程序。
我试过使用
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
我正在尝试创建自定义退出提示对话框,它应该执行以下操作:
- 它有是、否按钮以及 "Save new settings" 复选框项目
- 当我点击是时,对话框应该关闭主程序
- 当我点击否时,对话框应该回到主程序
所以,没什么特别的,但是当我单击 否 时,它会关闭主程序。
我试过使用
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