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

PyQt5中如何在QGroupBox内添加自适应布局的表格?

PyQt5布局问题解决方案

问题1:移除表格自带样式+表格内容居中

  • 用setStyleSheet移除表格边框与默认背景,消除“窗口”感
  • 设置表头、单元格的对齐方式为居中,同时让列宽自适应内容,确保表格整体居中显示

问题2:表格自适应行高+超出时显示滚动条

  • 移除setMaximumSize固定尺寸,让布局根据内容自动调整表格高度
  • 开启表格垂直滚动条,当内容超出QGroupBox最大高度时自动激活
  • 新增行后自动调整行高适配内容

问题3:按钮随表格自动下移并居中

  • 将表格和按钮放在同一个QVBoxLayout中
  • 给按钮设置居中对齐,布局会自动维护按钮在表格下方的位置

完整修正代码

from PyQt5.QtWidgets import (QApplication, QMainWindow, QGroupBox, QVBoxLayout, 
                             QTableWidget, QTableWidgetItem, QPushButton, QHeaderView, QWidget)
from PyQt5.QtCore import Qt

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        # 主窗口布局
        main_layout = QVBoxLayout()
        central_widget = self.centralWidget() or QWidget()
        central_widget.setLayout(main_layout)
        self.setCentralWidget(central_widget)

        # 创建QGroupBox
        self.groupbox1 = QGroupBox('Data')
        self.groupbox1.setMaximumWidth(350)
        self.groupbox1.setMaximumHeight(400)
        # GroupBox内部布局
        group_layout = QVBoxLayout()
        self.groupbox1.setLayout(group_layout)
        main_layout.addWidget(self.groupbox1)

        # 创建QTableWidget
        self.table_widget = QTableWidget()
        self.table_widget.setColumnCount(2)
        self.table_widget.setHorizontalHeaderLabels(['ID', 'Name'])
        
        # 移除表格自带样式
        self.table_widget.setStyleSheet("""
            QTableWidget {
                border: none;
                background-color: transparent;
            }
            QHeaderView::section {
                border: none;
                background-color: #f0f0f0;
                padding: 4px;
            }
        """)
        
        # 设置内容居中
        self.table_widget.horizontalHeader().setDefaultAlignment(Qt.AlignCenter)
        # 列宽自适应内容
        self.table_widget.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
        # 开启垂直滚动条,超出时自动显示
        self.table_widget.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        # 禁止编辑单元格(可选,按需调整)
        self.table_widget.setEditTriggers(QTableWidget.NoEditTriggers)

        # 添加表格到GroupBox布局并居中
        group_layout.addWidget(self.table_widget, alignment=Qt.AlignCenter)

        # 添加数据按钮
        self.add_btn = QPushButton('添加行')
        self.add_btn.clicked.connect(self.add_row)
        # 按钮居中并添加到布局
        group_layout.addWidget(self.add_btn, alignment=Qt.AlignCenter)

    def add_row(self):
        # 添加新行逻辑
        row_count = self.table_widget.rowCount()
        self.table_widget.insertRow(row_count)
        # 设置示例数据
        self.table_widget.setItem(row_count, 0, QTableWidgetItem(str(row_count+1)))
        self.table_widget.setItem(row_count, 1, QTableWidgetItem(f'Name_{row_count+1}'))
        # 调整行高适配内容
        self.table_widget.resizeRowToContents(row_count)

if __name__ == '__main__':
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()

关键改动说明

  1. 样式移除:通过setStyleSheet清除表格边框与默认背景,替换为简洁样式
  2. 内容居中:设置表头默认对齐为居中,确保表头、单元格内容都居中
  3. 自适应高度:取消表格固定尺寸限制,让布局根据行数自动调整高度,超出GroupBox上限时自动显示滚动条
  4. 按钮布局:表格与按钮共用垂直布局,设置按钮居中后,布局会自动跟随表格高度变化调整按钮位置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:53:14