Brad
Brad

Reputation: 201

Extra window visible when changing PySide.QtGui.QTabWidget UI

I am seeing an extra window when I change the ui in a PySide.QtGui.QMainWindow. In the example below, I have two PySide.QtGui.QTabWidget I am switching between.

I have tried deleting the existing ui objects with deleteLater() and del. I have also tried reusing the same QTabWidget instead of constructing a new one when switching UI.

All have the same result as illustrated in the gif below (same result on windows):

Example gif

I suspect my I am going about this in the wrong way. Any suggestions on the proper way to accomplish this is appreciated.

import sys
from PySide import QtGui


class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        # instance vars
        self.mode_menu = None
        self.mode_1_action = None
        self.mode_2_action = None
        self.mode_1_tabs_widget = None
        self.mode_1_layout = None
        self.mode_1_content_widget = None
        self.mode_2_tabs_widget = None
        self.mode_2_layout = None
        self.mode_2_content_widget = None

        # Setup the window
        self.resize(750, 550)
        self.create_actions()
        self.create_menus()
        self.mode_1_ui()

    def mode_1_ui(self):
        # create tab widget
        self.mode_1_tabs_widget = QtGui.QTabWidget()
        self.mode_1_tabs_widget.addTab(SampleTab(), "Tab 1")
        self.mode_1_tabs_widget.addTab(SampleTab(), "Tab 2")
        self.mode_1_tabs_widget.addTab(SampleTab(), "Tab 3")
        self.mode_1_tabs_widget.addTab(SampleTab(), "Tab 4")

        # create the layout area for tab widget
        self.mode_1_layout = QtGui.QHBoxLayout()
        self.mode_1_layout.addWidget(self.mode_1_tabs_widget)

        # create content area widget for padding
        self.mode_1_content_widget = QtGui.QWidget()
        self.mode_1_content_widget.setContentsMargins(5, 5, 5, 0)
        self.mode_1_content_widget.setLayout(self.mode_1_layout)

        # set the central widget
        self.setCentralWidget(self.mode_1_content_widget)
        self.setWindowTitle("Mode 1")

    def mode_2_ui(self):
        # create tab widget
        self.mode_2_tabs_widget = QtGui.QTabWidget()
        self.mode_2_tabs_widget.addTab(SampleTab(), "Tab 1")
        self.mode_2_tabs_widget.addTab(SampleTab(), "Tab 2")
        self.mode_2_tabs_widget.addTab(SampleTab(), "Tab 3")
        self.mode_2_tabs_widget.addTab(SampleTab(), "Tab 4")
        self.mode_2_tabs_widget.addTab(SampleTab(), "Tab 5")
        self.mode_2_tabs_widget.addTab(SampleTab(), "Tab 6")
        self.mode_2_tabs_widget.addTab(SampleTab(), "Tab 7")
        self.mode_2_tabs_widget.addTab(SampleTab(), "Tab 8")

        # create the layout area for tab widget
        self.mode_2_layout = QtGui.QHBoxLayout()
        self.mode_2_layout.addWidget(self.mode_2_tabs_widget)

        # create content area widget for padding
        self.mode_2_content_widget = QtGui.QWidget()
        self.mode_2_content_widget.setContentsMargins(5, 5, 5, 0)
        self.mode_2_content_widget.setLayout(self.mode_2_layout)

        # set the central widget
        self.setCentralWidget(self.mode_2_content_widget)
        self.setWindowTitle("Mode 2")

    # setup the menus
    def create_menus(self):
        # file menu
        self.mode_menu = self.menuBar().addMenu("&Mode")
        self.mode_menu.addAction(self.mode_1_action)
        self.mode_menu.addAction(self.mode_2_action)

    # setup the menu items
    def create_actions(self):
        # file menu actions
        self.mode_1_action = QtGui.QAction("Mode 1", self, shortcut="Ctrl+1", statusTip="Mode 1", triggered=self.mode_1)
        self.mode_2_action = QtGui.QAction("Mode 2", self, shortcut="Ctrl+2", statusTip="Mode 2", triggered=self.mode_2)

    # setup the menu functions
    def mode_1(self):
        print "mode 1"
        self.mode_1_ui()

    def mode_2(self):
        print "mode 2"
        self.mode_2_ui()


class SampleTab(QtGui.QWidget):
    def __init__(self, parent=None):
        super(SampleTab, self).__init__(parent)
        label = QtGui.QLabel('Sample tab', self)
        label.move(15, 10)
        self.show()


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

Upvotes: 2

Views: 406

Answers (1)

qurban
qurban

Reputation: 3945

This problem is due to the following reason:

When you create SampleTab, you do not pass any parent widget to SampleTab. When you create object of SampleTab, it is created with no parent at all. Thus an independent window is created for a small interval of time. Means that, as long as the SampleTab is not added to QTabWidget, it remains independent for small period.

Try doing the following:

self.mode_1_tabs_widget = QtGui.QTabWidget()
self.mode_1_tabs_widget.addTab(SampleTab(self.mode_1_tabs_widget), "Tab 1")
self.mode_1_tabs_widget.addTab(SampleTab(self.mode_1_tabs_widget), "Tab 2")
self.mode_1_tabs_widget.addTab(SampleTab(self.mode_1_tabs_widget), "Tab 3")
self.mode_1_tabs_widget.addTab(SampleTab(self.mode_1_tabs_widget), "Tab 4")

Now, when SampleTab gets created, it has a parent. Do the same for your mode_2_tabs_widget

EDIT

Please note that, you have to pass self.mode_2_tabs_widget as parent of SampleTab in the second case.

Upvotes: 2

Related Questions