PyQt5 QTabWidget如何为每个标签页设置独立高度?
解决QTabWidget标签页高度最小化问题(无需QSpacer)
现有PyQt5生成的QTabWidget代码,希望每个标签页的高度尽可能紧凑(类似设置QSizePolicy的Minimum或Fixed属性),且不使用QSpacer组件。
方法1:设置标签页与内部控件的尺寸策略
直接为标签页部件和内部控件设置垂直方向的尺寸策略,同时调整布局边距减少空白:
- 为每个标签页设置垂直尺寸策略为
Minimum,让高度仅适配内容最小需求 - 调整标签页内部布局的边距和间距,消除多余空白
- 为内部控件(如QLabel)设置垂直尺寸策略为
Minimum,避免控件被拉伸
修改代码关键部分:
# 在setupUi方法中,创建标签页后添加 # 为Tab 1设置尺寸策略 self.tab.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) # 调整Tab1布局的边距和间距 self.gridLayout_2.setContentsMargins(0, 0, 0, 0) self.gridLayout_2.setSpacing(0) # 为Tab1内的标签设置尺寸策略 self.label.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.label_2.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) # 为Tab 2做同样设置 self.tab_2.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.setContentsMargins(0, 0, 0, 0) self.gridLayout_3.setSpacing(0) # Tab2内所有QLabel都设置相同尺寸策略(示例以label_29为例) self.label_29.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
方法2:重写QTabWidget的sizeHint方法
自定义QTabWidget类,重写sizeHint方法让整体高度适配当前显示的标签页内容:
class CustomTabWidget(QtWidgets.QTabWidget): def sizeHint(self): size = super().sizeHint() if self.currentWidget(): # 计算当前标签页的最小高度 + 标签栏高度 content_height = self.currentWidget().minimumSizeHint().height() tab_bar_height = self.tabBar().height() size.setHeight(content_height + tab_bar_height) return size
然后在setupUi中替换原QTabWidget:
# 替换原self.tabWidget = QtWidgets.QTabWidget(...) self.tabWidget = CustomTabWidget(self.centralwidget)
修改后的完整示例代码
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'tab_widget.ui' # # Created by: PyQt5 UI code generator 5.15.7 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. from PyQt5 import QtCore, QtGui, QtWidgets class CustomTabWidget(QtWidgets.QTabWidget): def sizeHint(self): size = super().sizeHint() if self.currentWidget(): content_height = self.currentWidget().minimumSizeHint().height() tab_bar_height = self.tabBar().height() size.setHeight(content_height + tab_bar_height) return size class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(800, 570) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.gridLayout = QtWidgets.QGridLayout(self.centralwidget) self.gridLayout.setObjectName("gridLayout") self.tabWidget = CustomTabWidget(self.centralwidget) self.tabWidget.setObjectName("tabWidget") self.tab = QtWidgets.QWidget() self.tab.setObjectName("tab") self.tab.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_2 = QtWidgets.QGridLayout(self.tab) self.gridLayout_2.setObjectName("gridLayout_2") self.gridLayout_2.setContentsMargins(0,0,0,0) self.gridLayout_2.setSpacing(0) self.label = QtWidgets.QLabel(self.tab) self.label.setObjectName("label") self.label.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1) self.label_2 = QtWidgets.QLabel(self.tab) self.label_2.setObjectName("label_2") self.label_2.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_2.addWidget(self.label_2, 1, 0, 1, 1) self.tabWidget.addTab(self.tab, "") self.tab_2 = QtWidgets.QWidget() self.tab_2.setObjectName("tab_2") self.tab_2.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3 = QtWidgets.QGridLayout(self.tab_2) self.gridLayout_3.setObjectName("gridLayout_3") self.gridLayout_3.setContentsMargins(0,0,0,0) self.gridLayout_3.setSpacing(0) self.label_29 = QtWidgets.QLabel(self.tab_2) self.label_29.setObjectName("label_29") self.label_29.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_29, 0, 0, 1, 1) self.label_27 = QtWidgets.QLabel(self.tab_2) self.label_27.setObjectName("label_27") self.label_27.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_27, 1, 0, 1, 1) self.label_28 = QtWidgets.QLabel(self.tab_2) self.label_28.setObjectName("label_28") self.label_28.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_28, 2, 0, 1, 1) self.label_3 = QtWidgets.QLabel(self.tab_2) self.label_3.setObjectName("label_3") self.label_3.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_3, 3, 0, 1, 1) self.label_4 = QtWidgets.QLabel(self.tab_2) self.label_4.setObjectName("label_4") self.label_4.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_4, 4, 0, 1, 1) self.label_5 = QtWidgets.QLabel(self.tab_2) self.label_5.setObjectName("label_5") self.label_5.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_5, 5, 0, 1, 1) self.label_8 = QtWidgets.QLabel(self.tab_2) self.label_8.setObjectName("label_8") self.label_8.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_8, 6, 0, 1, 1) self.label_6 = QtWidgets.QLabel(self.tab_2) self.label_6.setObjectName("label_6") self.label_6.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_6, 7, 0, 1, 1) self.label_7 = QtWidgets.QLabel(self.tab_2) self.label_7.setObjectName("label_7") self.label_7.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_7, 8, 0, 1, 1) self.label_11 = QtWidgets.QLabel(self.tab_2) self.label_11.setObjectName("label_11") self.label_11.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_11, 9, 0, 1, 1) self.label_9 = QtWidgets.QLabel(self.tab_2) self.label_9.setObjectName("label_9") self.label_9.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_9, 10, 0, 1, 1) self.label_10 = QtWidgets.QLabel(self.tab_2) self.label_10.setObjectName("label_10") self.label_10.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_10, 11, 0, 1, 1) self.label_14 = QtWidgets.QLabel(self.tab_2) self.label_14.setObjectName("label_14") self.label_14.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_14, 12, 0, 1, 1) self.label_12 = QtWidgets.QLabel(self.tab_2) self.label_12.setObjectName("label_12") self.label_12.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_12, 13, 0, 1, 1) self.label_13 = QtWidgets.QLabel(self.tab_2) self.label_13.setObjectName("label_13") self.label_13.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_13, 14, 0, 1, 1) self.label_17 = QtWidgets.QLabel(self.tab_2) self.label_17.setObjectName("label_17") self.label_17.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_17, 15, 0, 1, 1) self.label_15 = QtWidgets.QLabel(self.tab_2) self.label_15.setObjectName("label_15") self.label_15.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_15, 16, 0, 1, 1) self.label_16 = QtWidgets.QLabel(self.tab_2) self.label_16.setObjectName("label_16") self.label_16.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_16, 17, 0, 1, 1) self.label_20 = QtWidgets.QLabel(self.tab_2) self.label_20.setObjectName("label_20") self.label_20.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_20, 18, 0, 1, 1) self.label_18 = QtWidgets.QLabel(self.tab_2) self.label_18.setObjectName("label_18") self.label_18.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_18, 19, 0, 1, 1) self.label_19 = QtWidgets.QLabel(self.tab_2) self.label_19.setObjectName("label_19") self.label_19.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_19, 20, 0, 1, 1) self.label_23 = QtWidgets.QLabel(self.tab_2) self.label_23.setObjectName("label_23") self.label_23.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_23, 21, 0, 1, 1) self.label_21 = QtWidgets.QLabel(self.tab_2) self.label_21.setObjectName("label_21") self.label_21.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_21, 22, 0, 1, 1) self.label_22 = QtWidgets.QLabel(self.tab_2) self.label_22.setObjectName("label_22") self.label_22.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_22, 23, 0, 1, 1) self.label_26 = QtWidgets.QLabel(self.tab_2) self.label_26.setObjectName("label_26") self.label_26.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_26, 24, 0, 1, 1) self.label_24 = QtWidgets.QLabel(self.tab_2) self.label_24.setObjectName("label_24") self.label_24.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_24, 25, 0, 1, 1) self.label_25 = QtWidgets.QLabel(self.tab_2) self.label_25.setObjectName("label_25") self.label_25.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addWidget(self.label_25, 26, 0, 1, 1) self.tabWidget.addTab(self.tab_2, "") self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1) MainWindow.setCentralWidget(self.centralwidget) self.retranslateUi(MainWindow) self.tabWidget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.label.setText(_translate("MainWindow", "TextLabel")) self.label_2.setText(_translate("MainWindow", "TextLabel")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Tab 1")) self.label_29.setText(_translate("MainWindow", "TextLabel")) self.label_27.setText(_translate("MainWindow", "TextLabel")) self.label_28.setText(_translate("MainWindow", "TextLabel")) self.label_3.setText(_translate("MainWindow", "TextLabel")) self.label_4.setText(_translate("MainWindow", "TextLabel")) self.label_5.setText(_translate("MainWindow", "TextLabel")) self.label_8.setText(_translate("MainWindow", "TextLabel")) self.label_6.setText(_translate("MainWindow", "TextLabel")) self.label_7.setText(_translate("MainWindow", "TextLabel")) self.label_11.setText(_translate("MainWindow", "TextLabel")) self.label_9.setText(_translate("MainWindow", "TextLabel")) self.label_10.setText(_translate("MainWindow", "TextLabel")) self.label_14.setText(_translate("MainWindow", "TextLabel")) self.label_12.setText(_translate("MainWindow", "TextLabel")) self.label_13.setText(_translate("MainWindow", "TextLabel")) self.label_17.setText(_translate("MainWindow", "TextLabel")) self.label_15.setText(_translate("MainWindow", "TextLabel")) self.label_16.setText(_translate("MainWindow", "TextLabel")) self.label_20.setText(_translate("MainWindow", "TextLabel")) self.label_18.setText
相关产品推荐
相关产品推荐

