0

我正在尝试编写一个利用 QMainWindow 并在那里有一个 QMenuBar 的应用程序,该应用程序具有 File->Exit 功能,它也使用 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>

我做错了什么?

4

2 回答 2

2

您可能会在这里找到更好的答案

PyQt:单击 X 不会触发 closeEvent

看来问题出在里面,

    self.ui = uic.loadUi("test.ui")
    self.ui.show()

在哪里创建一个名为 self.ui 的实例

于 2013-05-25T07:26:20.207 回答
0

在我看来,您正在覆盖 closeEvent,然后在其中什么也不做。调用event.accept()实际上并不执行事件。它只是告诉事件对象它已被接受,因此事件不会继续传播。在 C++ 领域,你需要做这样的事情

void closeEvent(QCloseEvent *Event) {
    // do some stuff
    QMainWindow::closeEvent(event);
}

请注意对QMainWindow's close 事件的调用,这是实际关闭窗口的代码所在的位置。

于 2013-04-01T15:34:00.757 回答