【问题标题】:PyQt's QMainWindow closeEvent is never calledPyQt 的 QMainWindow closeEvent 永远不会被调用
【发布时间】: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()

【问题讨论】:

    标签: python events pyqt4


    【解决方案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
    猜你喜欢
    • 2012-10-27
    • 2013-10-12
    • 2012-03-27
    • 2013-08-29
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 2015-10-15
    相关资源
    最近更新 更多