PyQt 的 QMainWindow closeEvent 永远不会被调用

Posted

技术标签:

【中文标题】PyQt 的 QMainWindow closeEvent 永远不会被调用【英文标题】:PyQt's QMainWindow closeEvent is never called 【发布时间】:2014-03-17 16:33:11 【问题描述】:

我在 python 中使用 pyqt4。 当我关闭 QMainWindow 窗口时,它不是由closeEvent 方法处理的。 请有人告诉我这段代码有什么问题:

from PyQt4 import QtCore, QtGui
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(277, 244)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
    def closeEvent(self,event):
        result = QtGui.QMessageBox.question(self,
                      "Confirm Exit...",
                      "Are you sure you want to exit ?",
                      QtGui.QMessageBox.Yes| QtGui.QMessageBox.No)
        event.ignore()

        if result == QtGui.QMessageBox.Yes:
         event.accept()
if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()

【问题讨论】:

【参考方案1】:

closeEventQMainwindow 的一个方法,但您正试图从自己的Ui_MainWindow 类中使用它。试试这个:

from PyQt4 import QtCore, QtGui


class MainWindow(QtGui.QMainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
        self.setupUi()

    def setupUi(self):
        self.setObjectName("MainWindow")
        self.resize(277, 244)
        self.statusbar = QtGui.QStatusBar()
        self.statusbar.setObjectName("statusbar")
        self.setStatusBar(self.statusbar)

    def closeEvent(self,event):
        result = QtGui.QMessageBox.question(self,
                      "Confirm Exit...",
                      "Are you sure you want to exit ?",
                      QtGui.QMessageBox.Yes| QtGui.QMessageBox.No)
        event.ignore()

        if result == QtGui.QMessageBox.Yes:
            event.accept()

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())

如果你想尽可能多地保留你的结构,试试这个:

from PyQt4 import QtCore, QtGui


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(277, 244)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        MainWindow.show()


class MyWindow(QtGui.QMainWindow):
    def closeEvent(self,event):
        result = QtGui.QMessageBox.question(self,
                      "Confirm Exit...",
                      "Are you sure you want to exit ?",
                      QtGui.QMessageBox.Yes| QtGui.QMessageBox.No)
        event.ignore()

        if result == QtGui.QMessageBox.Yes:
            event.accept()


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = MyWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    sys.exit(app.exec_())

【讨论】:

感谢您的回复。是的,代码运行良好。如何用我给定的代码解决这个问题?【参考方案2】:

这是我的解决方案,

    def closeEvent(self, e):
        close = QMessageBox.question(
            self,
            "Close Application",
            "Are you sure?",
            QMessageBox.Yes | QMessageBox.No,
            QMessageBox.No
        )
        e.ignore()
        if close == QMessageBox.Yes:
            e.accept()

【讨论】:

请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票 此功能与原题中的功能相同 这个答案本质上是一个已接受答案的副本,关于一个 > 6 岁的问题。不要发布重复的答案。 From Review

以上是关于PyQt 的 QMainWindow closeEvent 永远不会被调用的主要内容,如果未能解决你的问题,请参考以下文章

PyQt 在 QMainWindow 中创建 QDialog

访问 QMainWindow 类变量 - Pyside/PyQt

pyqt5,接收 AttributeError:“QMainWindow”对象没有属性“browseSlot”

PyQt 的 QMainWindow closeEvent 永远不会被调用

从 QWidget (PyQt4) 调用 QMainWindow 中的方法/属性

使用PyQt(QMainWindow)使用多重继承进行子类化时python中的MRO [重复]