PyQt5实现表格行高匹配列宽、正方形单元格及无滚动适配
PyQt5实现正方形棋盘表格布局方案
问题背景
要制作棋盘类游戏布局,需要QTableWidget的每个单元格都呈正方形,且界面能完整显示无需滚动。目前已实现列拉伸填充窗口,但不知道如何设置行高匹配列宽,也不清楚如何适配非正方形屏幕。当前代码如下:
def createTable(self): self.tableWidget = QTableWidget() #Row and column count self.tableWidget.setRowCount(9) self.tableWidget.setColumnCount(9) for i in range(9): for j in range(9): self.tableWidget.setItem(i, j, QTableWidgetItem()) header = self.tableWidget.horizontalHeader() for i in range(9): header.setSectionResizeMode(i, QtWidgets.QHeaderView.Stretch)
找不到类似QHeaderView的行设置方式,求可行方案。
解决思路与实现
1. 让行高匹配列宽
行表头没有直接的Stretch模式,但可以通过监听表格尺寸变化,动态计算单元格高度使其等于列宽:
- 重写表格的
resizeEvent方法,每次尺寸变更时触发计算 - 用表格宽度除以列数得到单列宽度,再把所有行的高度设为该值
2. 适配非正方形屏幕,避免滚动
要让表格完整显示无滚动,需将表格尺寸限制在窗口可用区域内:
- 取窗口宽高中的较小值作为表格的最大正方形边长
- 设置表格固定尺寸为这个正方形值,确保单元格均匀分配空间
完整代码示例
from PyQt5 import QtWidgets, QtCore class ChessboardTable(QtWidgets.QTableWidget): def __init__(self, rows=9, cols=9, parent=None): super().__init__(rows, cols, parent) self.initUI() def initUI(self): # 初始化单元格 for i in range(self.rowCount()): for j in range(self.columnCount()): self.setItem(i, j, QtWidgets.QTableWidgetItem()) # 设置列拉伸模式 header = self.horizontalHeader() header.setSectionResizeMode(QtWidgets.QHeaderView.Stretch) # 隐藏表头(可选,棋盘游戏通常不需要) self.horizontalHeader().setVisible(False) self.verticalHeader().setVisible(False) # 关闭滚动条 self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) def resizeEvent(self, event): super().resizeEvent(event) # 计算单列宽度,同步设置行高 col_width = self.width() // self.columnCount() for i in range(self.rowCount()): self.setRowHeight(i, col_width) # 强制表格为正方形,取宽高最小值 square_size = min(self.width(), self.height()) self.setFixedSize(square_size, square_size) class MainWindow(QtWidgets.QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("棋盘游戏") self.setMinimumSize(400, 400) self.table = ChessboardTable(9,9) self.setCentralWidget(self.table) if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) win = MainWindow() win.show() sys.exit(app.exec_())
关键说明
- 继承
QTableWidget重写resizeEvent,自动适配窗口尺寸变化,保证单元格始终为正方形 - 通过
setFixedSize将表格限制为正方形,确保完整显示无滚动条 - 隐藏表头和滚动条,贴合棋盘的视觉需求
- 列使用
Stretch模式自动分配宽度,行高通过计算列宽动态同步
内容的提问来源于stack exchange,提问作者Whitesnack
相关产品推荐
相关产品推荐

