我正在尝试编写一个使用QMainWindow的应用程序,并在那里使用带有File-> Exit功能的QMenuBar,它也使用UIC文件。我已经将我的项目剥离到尽管我的努力不起作用的部分 - 调用closeEvent,它被接受,但窗口没有关闭。这是我的test.py:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
import sys
from PyQt4 import QtCore, QtGui, uic
class TruEdit(QtGui.QMainWindow):
def __init__(self):
QtGui.QDialog.__init__(self)
self.ui = uic.loadUi("test.ui")
self.ui.show()
self.ui.actionWyj_cie.triggered.connect(self.wyjscie)
def wyjscie(self):
self.close()
def closeEvent(self, event):
event.accept()
print("WTF, still alive")
@QtCore.pyqtSlot()
def reject(self):
print("Never entered this")
return None
if __name__=="__main__":
app = QtGui.QApplication(sys.argv)
app.setQuitOnLastWindowClosed(True)
window = TruEdit()
sys.exit(app.exec_())
这是test.ui:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>21</height>
</rect>
</property>
<widget class="QMenu" name="menuPlik">
<property name="title">
<string>Plik</string>
</property>
<addaction name="actionWyj_cie"/>
</widget>
<addaction name="menuPlik"/>
</widget>
<widget class="QStatusBar" name="statusbar">
<property name="statusTip">
<string/>
</property>
</widget>
<action name="actionWyj_cie">
<property name="text">
<string>Wyjście</string>
</property>
<property name="shortcut">
<string>Ctrl+K</string>
</property>
</action>
</widget>
<resources/>
<connections/>
</ui>
我做错了什么?
答案 0 :(得分:2)
您可以在这里找到更好的答案
PyQt: clicking X doesn't trigger closeEvent
问题似乎在于,
self.ui = uic.loadUi("test.ui")
self.ui.show()
创建名为self.ui的实例
答案 1 :(得分:0)
在我看来,你正在覆盖closeEvent,然后在其中做任何事情。调用event.accept()
实际上并不执行该事件。它只是告诉事件对象它已被接受,以便事件不会继续传播。在C ++领域,你需要做这样的事情
void closeEvent(QCloseEvent *Event) {
// do some stuff
QMainWindow::closeEvent(event);
}
请注意对QMainWindow
的关闭事件的调用,这是实际关闭窗口的代码所在的位置。