Python 生成QCloseEvent赢得';不要关闭qmain窗口

Python 生成QCloseEvent赢得';不要关闭qmain窗口,python,qt,pyqt4,Python,Qt,Pyqt4,我正在尝试做一件非常简单的事情:添加一个带有Exit操作的菜单栏,该操作将在选中QMainWindow时关闭它。但是,当我实际单击退出时,它不会关闭应用程序。A SSCCE: from PyQt4 import QtGui, QtCore import sys class Window(QtGui.QMainWindow): def __init__(self, parent=None): super(Window, self).__init__(parent)

我正在尝试做一件非常简单的事情:添加一个带有
Exit
操作的菜单栏,该操作将在选中
QMainWindow
时关闭它。但是,当我实际单击退出时,它不会关闭应用程序。A 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_())
真正让我困惑的是,当我从
文件
菜单中单击
退出
时,我得到以下输出:

召唤

活动:

并且应用程序不会退出

如果我单击右上角的
X
,我会得到相同的结果(下至事件对象的相同内存地址):

召唤

活动:

应用程序确实退出了


这是在Windows 7 64位、Python 2.7.2、PyQt 4.8.6上实现的。

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

 exit_action.triggered.connect(self.close)
描述了
close
closeEvent
之间的交互:

bool QWidget.close(self)

此方法也是一个Qt槽,带有C++签名BoOL CULL()。 关闭此小部件。如果小部件已关闭,则返回true;否则 返回false

首先它向小部件发送一个QCloseEvent。如果该小部件处于隐藏状态,则该小部件将被隐藏 接受关闭事件。如果忽略该事件,则不会发生任何事情。这个 QWidget.closeEvent()的默认实现接受关闭 事件。

文件

QCloseEvent类包含描述关闭事件的参数

关闭事件通常被发送到用户想要关闭的小部件 从窗口菜单中选择“关闭”,或单击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_())