PyQt5 closeEvent 方法

Hug*_*ous 2 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_())
Run Code Online (Sandbox Code Playgroud)

感谢您的建议!

小智 9

问题是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()
Run Code Online (Sandbox Code Playgroud)


fur*_*ras 6

当您单击按钮时,程序会调用您的函数,但使用的event对象不同accept()ignore()因此您会收到错误消息,程序以退出代码 1 结束。

您可以分配self.close和程序将调用closeEvent()正确的事件对象。

quit.triggered.connect(self.close)
Run Code Online (Sandbox Code Playgroud)