PyQt5 QTabWidget多标签页控件跨Tab重复显示问题求助
问题根因
控件在所有标签页显示的问题由3处核心错误导致:
- 调用各标签页的构造方法时,传入了外层的
MainWindowWidget实例作为父容器,而非对应标签页的QWidget对象,导致所有控件都绑定到了整个TabWidget的外层容器上,自然所有标签页都能看到这些控件 - 添加Tab3时错误重复传入了
self.tab2作为标签页内容 - 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
相关产品推荐
相关产品推荐

