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_())