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_()
关键改动说明
- 样式移除:通过
setStyleSheet清除表格边框与默认背景,替换为简洁样式 - 内容居中:设置表头默认对齐为居中,确保表头、单元格内容都居中
- 自适应高度:取消表格固定尺寸限制,让布局根据行数自动调整高度,超出GroupBox上限时自动显示滚动条
- 按钮布局:表格与按钮共用垂直布局,设置按钮居中后,布局会自动跟随表格高度变化调整按钮位置
内容的提问来源于stack exchange,提问作者Souleater
相关产品推荐
相关产品推荐

