PyQt5 closeEvent方法

时间:2016-11-16 00:25:16

标签: python oop pyqt pyqt5

我目前正在学习如何使用pyqt5构建应用程序并遇到一些closeEvent方法的问题,覆盖因此要求用户通过QMessageBox对象进行确认。它似乎与X按钮配合良好 - 事件在确认动作时被“接受”,在单击取消按钮时被“取消”。但是,当我从下拉文件菜单中使用我的退出按钮时,无论我点击哪个按钮,程序都会以退出代码1关闭。看起来很奇怪,因为我在两种情况下都使用相同的closeEvent方法。

import sys

from PyQt5.QtWidgets import QApplication, QMessageBox, QMainWindow, QAction


class window(QMainWindow):
    def __init__(self):

        super().__init__()

    def createUI(self):


        self.setGeometry(500, 300, 700, 700)

        self.setWindowTitle("window")


        quit = QAction("Quit", self)
        quit.triggered.connect(self.closeEvent)

        menubar = self.menuBar()
        fmenu = menubar.addMenu("File")
        fmenu.addAction(quit)

    def closeEvent(self, event):
        close = QMessageBox()
        close.setText("You sure?")
        close.setStandardButtons(QMessageBox.Yes | QMessageBox.Cancel)
        close = close.exec()

        if close == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()

main = QApplication(sys.argv)
window = window()
window.createUI()
window.show()
sys.exit(main.exec_())

感谢您的建议!

4 个答案:

答案 0 :(得分:4)

当您单击按钮然后程序调用您的函数,但使用不具有eventaccept()的{​​{1}}对象,以便您收到错误消息并且程序以退出代码结束1.

您可以指定ignore(),程序会使用正确的事件对象调用self.close

closeEvent()

答案 1 :(得分:1)

我遇到了同样的问题,并修复了类型检查漏洞。这可能是一个丑陋的骇客,但它确实有效(在macOS 10.15上使用python 3.8.0和PyQt 5.14.2进行了测试)。

class Gui(QtWidgets.QMainWindow):
    def __init__(self):
        super(Gui, self).__init__()
        uic.loadUi("gui.ui", self)

        # ...

        self.actionExit = self.findChild(QtWidgets.QAction, "actionExit")
        self.actionExit.triggered.connect(self.closeEvent)

        # ...

    def closeEvent(self, event):
        reply = QMessageBox.question(self, 'Quit?',
                                     'Are you sure you want to quit?',
                                     QMessageBox.Yes | QMessageBox.No, QMessageBox.No)

        if reply == QMessageBox.Yes:
            if not type(event) == bool:
                event.accept()
            else:
                sys.exit()
        else:
            if not type(event) == bool:
                event.ignore()

答案 2 :(得分:0)

问题是accept是一个方法,而ignore只是一个属性。
这段代码对我有用:

def closeEvent(self, event):
            close = QtWidgets.QMessageBox.question(self,
                                         "QUIT",
                                         "Are you sure want to stop process?",
                                         QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
            if close == QtWidgets.QMessageBox.Yes:
                event.accept()
            else:
                event.ignore

答案 3 :(得分:0)

def exit_window(self, event):
    close = QtWidgets.QMessageBox.question(self,
                                           "QUIT?",
                                           "Are you sure want to STOP and EXIT?",
                                           QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
    if close == QtWidgets.QMessageBox.Yes:
        # event.accept()
        sys.exit()
    else:
        pass