2016-10-29 18 views
1

私は3つの別々のウィジェットを書いており、それぞれに'closeEvent 'が含まれています。ただし、ウィジェットがMainWindow内のタブとして配置されている場合、クローズイベントはトリガーされません。 MainWindowが終了したときに、各タブの 'closeEvent'を適切に起動するためのシグナルをどのように出力できますか?Trigger Close PySideのタブのイベントQTabWidget

私は、主な目標に焦点を当てるようにコードを単純化するために全力を尽くしました。各タブのクローズイベントを発行したいので、将来タブを追加すると柔軟性が増し、各ツールはまだ自己完結型になります。クローズ要求を受信したときに

import sys 
from PySide import QtGui, QtCore 

class TabA(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(TabA, self).__init__(parent) 
     self.resize(300, 300) 
     self.setWindowTitle('App A') 
     self.btn = QtGui.QPushButton("Button A") 
     grid = QtGui.QGridLayout() 
     grid.addWidget(self.btn) 
     self.setLayout(grid) 

    def closeEvent(self, event): 
     print "closing Tab A" 
     event.accept() 

class TabB(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(TabB, self).__init__(parent) 
     self.resize(300, 300) 
     self.setWindowTitle('App A') 
     self.btn = QtGui.QPushButton("Button A") 
     grid = QtGui.QGridLayout() 
     grid.addWidget(self.btn) 
     self.setLayout(grid) 

    def closeEvent(self, event): 
     print "closing Tab A" 
     event.accept() 

class TabC(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(TabC, self).__init__(parent) 
     self.resize(300, 300) 
     self.setWindowTitle('App A') 
     self.btn = QtGui.QPushButton("Button A") 
     grid = QtGui.QGridLayout() 
     grid.addWidget(self.btn) 
     self.setLayout(grid) 

    def closeEvent(self, event): 
     print "closing Tab A" 
     event.accept() 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 

     self.initUI() 

    def initUI(self): 
     self.resize(300, 300) 
     self.setWindowTitle('Tabs') 

     # Tabs 
     main_tabWidget = QtGui.QTabWidget() 
     main_tabWidget.addTab(TabA(), "TabA") 
     main_tabWidget.addTab(TabB(), "TabB") 
     main_tabWidget.addTab(TabC(), "TabC") 

     vbox = QtGui.QVBoxLayout() 
     vbox.addWidget(main_tabWidget) 
     vbox.setContentsMargins(0, 0, 0, 0) 

     main_widget = QtGui.QWidget() 
     main_widget.setLayout(vbox) 
     self.setCentralWidget(main_widget) 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    ex = MainWindow() 
    ex.show() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 

答えて

1

closeEvent方法

enter image description here

は唯一のトップレベルウィンドウのために呼ばれ、それはあなたのユースケースには適していません。ただし、アプリケーションがシャットダウンしている間に、接続できるシグナルがいくつかあります。

だから、例えば、あなたはこれを行うことができます:

class TabA(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(TabA, self).__init__(parent) 
     ... 
     QtGui.qApp.aboutToQuit.connect(self.handleClose) 

    def handleClose(self): 
     print "closing Tab A" 

この信号は、単にイベントループが終了する前に放出され、メインウィンドウが閉じた直後に放出されるQtGui.qApp.lastWindowClosed信号もあります。

(PS:この目的で__del__を使用するようにしないでください。シャットダウン時の正確な動作はPyQtでは厳密には定義されておらず、バージョン間で変更される可能性があります)。

関連する問題