我有一个PyQt GUI,它有多种关闭方式。如果他们X离开窗口,或者如果他们完成某项任务,则有两种方法。我的类从QMainWindow
扩展而来,实现了closeEvent
方法。
在使用X窗口的情况下,我想询问他们是否确定要退出,然后做一些清理并关闭,如果他们说是的话。
如果他们完成了某项任务,我只想进行清理并退出。
现在我的closeEvent
看起来像这样:
def closeEvent(self, event):
# Ask the user if they actually want to quit using custom message box
msg = MessageBox(self, 'Are you sure you want to quit?', title = 'Quit', buttons = QMessageBox.Yes|QMessageBox.No)
if msg.reply == QMessageBox.Yes:
#
# Do some cleanup here
#
super().close()
else:
event.ignore()
通过这种特定的设置,它总是询问他们是否确定要关闭,这对于他们X离开窗口是必要的。当他们完成特定任务时,我知道他们想要关闭,只想跳到清理和关闭过程,而不是问这个问题。
我的想法是,在某些特殊情况下,我将它们指向一个单独的函数,它执行必要的任务,然后调用close方法。但问题是,我不知道在调用close方法之前如何将X out进程引导到另一个方法。就像现在一样,它总是询问他们是否确定要退出,因为这是X out关闭方法的一部分。
有什么办法可以做我想做的事吗?
答案 0 :(得分:1)
解决方法是在不运行closeEvent
的情况下关闭应用程序,为此您可以使用函数qApp.quit()
。
例如,在下面的脚本中可以通过两种方法关闭:第一种是名为btn的新按钮,第二种是按钮X.对于第一种情况,我们将其连接到调用对话框的插槽,如果是接受我用qApp.quit关闭应用程序,第二种情况类似于你实现的情况。
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent=parent)
btn = QPushButton("close")
self.setCentralWidget(btn)
btn.clicked.connect(self.closeByButton)
def closeByButton(self):
msgBox = QMessageBox()
msgBox.setText("new Method")
msgBox.setStandardButtons(QMessageBox.Cancel | QMessageBox.Yes | QMessageBox.No);
msgBox.setDefaultButton(QMessageBox.Yes);
if msgBox.exec_() == QMessageBox.Yes:
qApp.quit()
def closeEvent(self, event):
msgBox = QMessageBox()
msgBox.setText("Button X Method")
msgBox.setStandardButtons(QMessageBox.Cancel | QMessageBox.Yes | QMessageBox.No);
msgBox.setDefaultButton(QMessageBox.Yes);
if msgBox.exec_() == QMessageBox.Yes:
event.accept()
else:
event.ignore()
app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())