You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5 QTabWidget多标签页控件跨Tab重复显示问题求助

问题根因

控件在所有标签页显示的问题由3处核心错误导致:

  1. 调用各标签页的构造方法时,传入了外层的MainWindowWidget实例作为父容器,而非对应标签页的QWidget对象,导致所有控件都绑定到了整个TabWidget的外层容器上,自然所有标签页都能看到这些控件
  2. 添加Tab3时错误重复传入了self.tab2作为标签页内容
  3. MainWindow初始化时多了一行无意义的MainWindowWidget()实例化代码

修复步骤

1. 修改MainWindow.py代码

import os, sys, subprocess, atexit, PyQt5, pyodbc, time, datetime, getpass, csv, xlsxwriter
import Tab1, Tab2, Tab3

from PyQt5.QtWidgets import QApplication, QTabBar, QLayout, QLabel, QLineEdit, QMainWindow, QTabWidget, QWidget, QPushButton, QHBoxLayout, QVBoxLayout, QGroupBox, QRadioButton, QTextEdit, QCheckBox, QInputDialog, QFileDialog, QProgressBar, QTableWidget, QTableWidgetItem
from PyQt5.QtCore import *

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__()
        self.left = 50
        self.top = 50
        self.width = 720
        self.height = 600
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.table_widget = MainWindowWidget(self)
        self.setCentralWidget(self.table_widget)


class MainWindowWidget(QWidget):
    def __init__(self, parent=None):
        super(QWidget, self).__init__(parent)
        self.layout = QVBoxLayout(self)
        self.setLayout(self.layout)

        self.tabs = QTabWidget()
        self.tab1 = QWidget()
        self.tab2 = QWidget()
        self.tab3 = QWidget()
        self.layout.addWidget(self.tabs)

        # 修复Tab3的添加逻辑
        self.tabs.addTab(self.tab1, "Tab1")
        self.tabs.addTab(self.tab2, "Tab2")
        self.tabs.addTab(self.tab3, "Tab3")

        # 传入对应标签页对象作为构造方法的参数
        Tab1.Tab1.CreateTab1(self.tab1)
        Tab2.Tab2.CreateTab2(self.tab2)
        Tab3.Tab3.CreateTab3(self.tab3)

    def exit_handler(self):
        print('closing application')
        atexit.register(exit_handler(self))


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

2. 可选优化(不影响运行,建议修改)

你定义的Tab1、Tab2、Tab3类不需要继承QMainWindow,直接改为普通类或者将构造方法改为静态方法即可,Tab1、Tab2的现有构造逻辑不需要修改,只要保证创建控件时父对象是传入的标签页参数,就不会影响你用.setGeometry摆放控件的需求。


内容的提问来源于stack exchange,提问作者deathstr0ke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 23:24:03