【问题标题】:Unable to close the GUI application无法关闭 GUI 应用程序
【发布时间】:2019-03-20 14:17:08
【问题描述】:
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(277, 244)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
        self.menubar.setObjectName("menubar")
        self.menuFile = QtWidgets.QMenu(self.menubar)
        self.menuFile.setObjectName("menuFile")
        MainWindow.setMenuBar(self.menubar)
        self.actionQuit = QtWidgets.QAction(MainWindow)
        self.actionQuit.setObjectName("actionQuit")
        self.actionQuit.setShortcut("Ctrl+Q")
        self.actionQuit.setStatusTip("Quit the application")
        self.actionQuit.triggered.connect(MainWindow.closeEvent)
        self.menuFile.addAction(self.actionQuit)
        self.menubar.addAction(self.menuFile.menuAction())
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        MainWindow.show()

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.menuFile.setTitle(_translate("MainWindow", "File"))
        self.actionQuit.setText(_translate("MainWindow", "Quit"))

class MyWindow(QtWidgets.QMainWindow):

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

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

当我尝试使用 Ctrl+Q 快捷方式关闭应用程序时,消息框会弹出问题,当我单击其中一个选项时,我会得到 ​​p>

AttributeError: 'bool' object has no attribute 'ignore'

我哪里做错了?

【问题讨论】:

    标签: python python-3.x pyqt pyqt5 qwidget


    【解决方案1】:

    您不应该直接调用closeEvent() 方法(或xxxEvent 的方法),因为这是由Qt 的内部元素通过事件循环调用的,您应该使用close() 方法来间接调用@ 987654324@:

    from PyQt5 import QtCore, QtGui, QtWidgets
    
    class Ui_MainWindow(object):
    
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(277, 244)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            MainWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtWidgets.QMenuBar(MainWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
            self.menubar.setObjectName("menubar")
            self.menuFile = QtWidgets.QMenu(self.menubar)
            self.menuFile.setObjectName("menuFile")
            MainWindow.setMenuBar(self.menubar)
            self.actionQuit = QtWidgets.QAction(MainWindow)
            self.actionQuit.setObjectName("actionQuit")
            self.actionQuit.setShortcut("Ctrl+Q")
            self.actionQuit.setStatusTip("Quit the application")
            self.menuFile.addAction(self.actionQuit)
            self.menubar.addAction(self.menuFile.menuAction())
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
            self.menuFile.setTitle(_translate("MainWindow", "File"))
            self.actionQuit.setText(_translate("MainWindow", "Quit"))
    
    class MyWindow(QtWidgets.QMainWindow, Ui_MainWindow):
        def __init__(self, parent=None):
            super(MyWindow, self).__init__(parent)
            self.setupUi(self)
            self.actionQuit.triggered.connect(self.close)
    
        def closeEvent(self, event):
            print(event)
            result = QtWidgets.QMessageBox.question(self,
                          "Confirm Exit...",
                          "Are you sure you want to exit ?",
                          QtWidgets.QMessageBox.Yes| QtWidgets.QMessageBox.No)
            event.ignore()
            print(result)
            if result == QtWidgets.QMessageBox.Yes:
                event.accept()
    
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        w = MyWindow()
        w.show()
        sys.exit(app.exec_())
    

    【讨论】:

      【解决方案2】:

      通过像这样将动作连接到函数,self.actionQuit.triggered.connect(MainWindow.closeEvent)

      您确保将triggered 信号传递给函数,但该信号是documentation 中所写的布尔值,这意味着event 在下面的代码中是一个布尔值:

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

      布尔值没有ignoreaccept 属性,因此会出现AttributeError。我没有解决方案,但这就是您问题的根源。希望使用键盘快捷键退出程序是一个已经回答的问题。

      【讨论】:

      • 感谢您的回复。通过打印语句弄清楚了。看看是否有人可以发布一些解决方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 2012-11-12
      相关资源
      最近更新 更多