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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:01:08