我是 PyQt 的新手,试图开发简单的应用程序。我用 Qt-designer 设计了简单的 ui。如果用户真的想在单击 X 或 ,,Exit'' 按钮或从菜单中选择退出时退出应用程序,我需要额外的确认。

这是代码:

import sys
from PyQt4 import QtGui, QtCore, uic

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)

        self.ui = uic.loadUi('main_window.ui')
        self.ui.show()

        self.ui.btnExit.clicked.connect(self.close)
        self.ui.actionExit.triggered.connect(self.close)

    def closeEvent(self, event):
        print("event")
        reply = QtGui.QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

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


def main():
    app = QtGui.QApplication(sys.argv)
    win = MainWindow()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

问题在于:
  • 当我在主窗口上点击 X 时,closeEvent 函数不会触发
  • 当我点击退出按钮或从菜单中选择 ,,Exit'' 时,功能
    被调用,但单击是不会关闭应用程序。

  • 我在 SO 上发现了一些问题并搜索了教程,但没有涵盖此类问题。我究竟做错了什么?

    最佳答案

    请注意,您正在执行以下操作:

    self.ui = uic.loadUi('main_window.ui')
    self.ui.show()
    

    您的实际窗口是 ui 内的实例属性( win )。不是 win 本身。它没有实现 closeEvent

    loadUi 可以在实例中加载 .ui 文件。
    PyQt4.uic.loadUi(uifile[, baseinstance=None[, package='']])
    

    你应该用那个。这样,您的代码将是:
    import sys
    from PyQt4 import QtGui, QtCore, uic
    
    class MainWindow(QtGui.QMainWindow):
        def __init__(self):
            QtGui.QMainWindow.__init__(self)
    
            uic.loadUi('main_window.ui', self)
    
            self.btnExit.clicked.connect(self.close)
            self.actionExit.triggered.connect(self.close)
    
        def closeEvent(self, event):
            print("event")
            reply = QtGui.QMessageBox.question(self, 'Message',
                "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
    
            if reply == QtGui.QMessageBox.Yes:
                event.accept()
            else:
                event.ignore()
    
    
    def main():
        app = QtGui.QApplication(sys.argv)
        win = MainWindow()
        win.show()
        sys.exit(app.exec_())
    
    
    if __name__ == "__main__":
        main()
    

    注意:我不是 show 窗口的粉丝 __init__ 。明确的更好。所以,我把它移到了 main 。随意修改它。

    关于python - PyQt:单击 X 不会触发 closeEvent,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14834494/

    10-12 23:19