2013-04-01 55 views
0

我試圖編寫一個應用程序,利用QMainWindow並有一個QMenuBar那裏與文件 - >退出功能,它也使用UIC文件。我已經將我的項目剝離到了儘管我的努力無法工作的部分 - closeEvent被調用,它被接受,但窗口不關閉。這裏是我的test.py:QMainWindow.close不關閉窗口,儘管event.accept on closeEvent

#! /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> 

我做了什麼錯?

回答

2

你可能會在這裏找到一個更好的答案

PyQt: clicking X doesn't trigger closeEvent

看來問題就在於內,

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

當一個實例被創建名爲self.ui

+1

+1:這是答案。提問者的代碼創建了兩個窗口:一個來自顯示的self.ui,另一個來自底層代碼中創建的窗口,它從不顯示。提問者的代碼不起作用,因爲它試圖關閉從未打開過的窗口。 –

0

在我看來,你重寫了closeEvent,然後在它裏面什麼都不做。調用event.accept()並不實際執行該事件。它只是告訴事件對象它已被接受,所以事件不會繼續傳播。在C++中的土地,你需要做這樣的事情

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

注意調用QMainWindow的關閉事件,這是在爲真正關閉窗口代碼所在。

+0

不幸的是,沒有幫助。我嘗試了兩個註釋closeEvent並調用QMainWindow的窗口,窗口在兩次嘗試中都存活。 – d33tah

+0

奇怪..你是否真的看到你的調試輸出,當你重寫closeEvent? – Chris

+0

是的,我是。除「從未輸入過」外。 – d33tah