Reputation: 201
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):
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
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