更改PySide.QtGui.QTabWidget UI时可以看到额外的窗口

时间:2014-01-04 04:49:08

标签: python pyqt pyqt4 pyside

当我在PySide.QtGui.QMainWindow中更改ui时,我看到了一个额外的窗口。在下面的例子中,我有两个我正在切换的PySide.QtGui.QTabWidget。

我尝试用deleteLater()和del删除现有的ui对象。我也尝试重用相同的QTabWidget,而不是在切换UI时构建一个新的。

所有结果都与下面的gif中显示的结果相同(在Windows上的结果相同):

Example gif

我怀疑我会以错误的方式解决这个问题。任何有关实现这一目标的正确方法的建议都表示赞赏。

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_())

1 个答案:

答案 0 :(得分:1)

此问题是由于以下原因造成的:

创建SampleTab时,您不会将任何parent窗口小部件传递给SampleTab。创建SampleTab的对象时,创建的对象完全没有父级。因此,在很短的时间间隔内创建一个独立的窗口。意味着,只要SampleTab未添加到QTabWidget,它就会在很短的时间内保持独立。

尝试执行以下操作:

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")

现在,当创建SampleTab时,它有一个父级。 对mode_2_tabs_widget

执行相同的操作

修改

请注意,在第二种情况下,您必须将self.mode_2_tabs_widget作为SampleTab的父级传递。