生成QCloseEvent不会关闭QMainWindow

时间:2014-09-08 03:24:32

标签: python qt pyqt4

我正在尝试做一些非常简单的事情:添加一个带有Exit操作的菜单栏,该操作会在选中时关闭QMainWindow。但是,当我实际点击Exit时,它不会关闭应用程序。一个SSCCE:

from PyQt4 import QtGui, QtCore

import sys

class Window(QtGui.QMainWindow):

    def __init__(self, parent=None):
        super(Window, self).__init__(parent)
        widget = QtGui.QWidget()
        self.setCentralWidget(widget)

        self.menu_bar = QtGui.QMenuBar(self)
        menu = self.menu_bar.addMenu('File')

        exit_action = QtGui.QAction('Exit', self)
        exit_action.triggered.connect(lambda:
            self.closeEvent(QtGui.QCloseEvent()))
        menu.addAction(exit_action)
        self.setMenuBar(self.menu_bar)

    def closeEvent(self, event):
        print('Calling')
        print('event: {0}'.format(event))
        event.accept()


app = QtGui.QApplication(sys.argv)
form = Window()
form.show()
sys.exit(app.exec_())

让我感到困惑的是,当我点击Exit菜单中的File时,我会得到以下输出:

  

致电

     

event:< PyQt4.QtGui.QCloseEvent对象位于0x024B7348>

并且应用程序不会退出。

如果我点击右上角X,我会得到同样的东西(直到事件对象的相同内存地址):

  

致电

     

event:< PyQt4.QtGui.QCloseEvent对象位于0x024B7348>

并且应用程序 退出。

这是在Windows 7 64位,Python 2.7.2,PyQt 4.8.6。

2 个答案:

答案 0 :(得分:1)

关闭事件实际上并不会使窗口关闭,而是在窗口已经关闭时触发。要实际关闭窗口,您需要调用self.close(),这会产生触发QCloseEvent的副作用。所以只需使用它:

 exit_action.triggered.connect(self.close)

documentation of close描述了closecloseEvent之间的互动:

  

bool QWidget.close(self)

     

此方法也是带有C ++签名bool close()的Qt槽。

     

关闭此小部件。如果窗口小部件已关闭,则返回true;除此以外   返回false。

     

首先它向小部件发送一个QCloseEvent。如果它是隐藏的小部件   接受关闭事件。如果它忽略了该事件,则没有任何反应。该   QWidget.closeEvent()的默认实现接受关闭   事件

答案 1 :(得分:1)

文件says

  

QCloseEvent 类包含描述close事件的参数。

     

通常会将关闭事件发送到用户想要关闭的小部件   从窗口菜单中选择“关闭”,或单击X标题   酒吧按钮。当您致电 QWidget.close()关闭时,也会发送它们   以编程方式创建小部件。

您可以通过QCloseEvent关闭信号直接致电,请致电self.close()

from PyQt4 import QtGui, QtCore

import sys

class Window(QtGui.QMainWindow):

    def __init__(self, parent=None):
        super(Window, self).__init__(parent)
        widget = QtGui.QWidget()
        self.setCentralWidget(widget)

        self.menu_bar = QtGui.QMenuBar(self)
        menu = self.menu_bar.addMenu('File')

        exit_action = QtGui.QAction('Exit', self)
        exit_action.triggered.connect(self.close)
        menu.addAction(exit_action)
        self.setMenuBar(self.menu_bar)

    def closeEvent(self, event):
        print('Calling')
        print('event: {0}'.format(event))
        event.accept()


app = QtGui.QApplication(sys.argv)
form = Window()
form.show()
sys.exit(app.exec_())