PySide QTabWidget中Tabs的触发关闭事件

时间:2016-10-29 22:46:02

标签: python pyside

我写了3个单独的小部件,每个小部件包含一个'closeEvent'。但是,当窗口小部件作为选项卡放置在MainWindow中时,不会触发关闭事件。当MainWindow关闭时,如何发出信号以正确触发每个标签的'closeEvent'?

我已尽力简化代码,专注于主要目标。我想为每个标签发出close事件,以便将来当我添加更多标签时,它会更灵活,每个工具仍然是自包含的。

enter image description here

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 个答案:

答案 0 :(得分:1)

仅在收到关闭请求时才调用closeEvent方法作为顶级窗口,因此它不适合您的用例。但是,在应用程序关闭时可以连接的几个信号发出。

例如,你可以这样做:

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中是严格未定义的,并且可以在版本之间进行更改。)