在PyQt

时间:2017-03-30 00:21:59

标签: python pyqt pyqt5

我有一个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关闭方法的一部分。

有什么办法可以做我想做的事吗?

1 个答案:

答案 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_())