gpt4 book ai didi

python - 更改 PySide.QtGui.QTabWidget UI 时可见额外窗口

转载 作者:太空宇宙 更新时间:2023-11-03 18:39:11 24 4
gpt4 key购买 nike

当我更改 PySide.QtGui.QMainWindow 中的 ui 时,我看到一个额外的窗口。在下面的示例中,我在两个 PySide.QtGui.QTabWidget 之间进行切换。

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

所有结果都与下面的 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_())

最佳答案

出现此问题的原因如下:

当您创建 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 的父级传递。

关于python - 更改 PySide.QtGui.QTabWidget UI 时可见额外窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20917025/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com