我正在尝试做一些非常简单的事情:添加一个带有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。
答案 0 :(得分:1)
关闭事件实际上并不会使窗口关闭,而是在窗口已经关闭时触发。要实际关闭窗口,您需要调用self.close()
,这会产生触发QCloseEvent
的副作用。所以只需使用它:
exit_action.triggered.connect(self.close)
documentation of close
描述了close
和closeEvent
之间的互动:
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_())