让表格尺寸随窗口自适应

编程语言 2026-07-11

在我的窗口里有一个表格,我给其中的一些单元格着色。 一切功能都正常,但我一直在努力寻找一种让表格适应窗口大小的方法。

我希望所有单元格始终可见、没有滚动条,并让它们根据表格所拥有的空间自动扩展或缩小,因为我的目标是对所有单元格一目了然。

下面是我使用的代码示例:

class ProductsTable(QTableWidget):
    def __init__(self, table_rows, table_columns):
        super().__init__()
        self.setDragEnabled(True)
        self.setDragDropMode(QtWidgets.QAbstractItemView.DragDrop)
        self.setAcceptDrops(True)
        self.setRowCount(table_rows)
        self.setColumnCount(table_columns)
        self.viewport().installEventFilter(self)
        self.controllers = None
        self.verticalScrollBar().setVisible(False)
        self.horizontalScrollBar().setVisible(False)
        for i in range(table_columns):
            self.horizontalHeader().setSectionResizeMode(i, QHeaderView.Stretch)
            print(self.columnWidth(i))

我将它简单地加入到窗口,如下所示:

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

        self.setWindowTitle("My App")
        table = ProductsTable(size_x, size_y)
        layout = QHBoxLayout()
        layout.addWidget(table)
        widget = QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)

我尝试将QHeaderView设置为拉伸,听起来像是我想要的,但没有成功。

我也尝试用QHeaderView.Fixed固定单元格大小,并通过setColumnWidth设置大小。我的问题是,显示结果显示单元格宽度不能小于58像素,显然太高。

如果把它设为200,它就能工作,单元格会扩展,但我不能把这个值降到58以下。

如果有谁对如何在窗口中让我的所有单元格始终可见有想法,将不胜感激。

解决方案

QHeaderView.Stretch 只是其中的一部分。最关键的问题在于表头的最小分段大小,这也是为什么你的列在大约58像素处停止缩小。

把两个表头都设为拉伸并降低它们的最小分段大小。

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QTableWidget, QHeaderView, QMainWindow, QWidget, QHBoxLayout


class ProductsTable(QTableWidget):
    def __init__(self, table_rows, table_columns):
        super().__init__()

        self.setRowCount(table_rows)
        self.setColumnCount(table_columns)

        self.verticalScrollBar().setVisible(False)
        self.horizontalScrollBar().setVisible(False)

        # Make rows/columns fill available space
        self.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)

        # Allow sections to shrink smaller than the default minimum
        self.horizontalHeader().setMinimumSectionSize(1)
        self.verticalHeader().setMinimumSectionSize(1)

        # Optional: hide headers if you only want the cells
        # self.horizontalHeader().hide()
        # self.verticalHeader().hide()

默认最小分段大小 QHeaderView 通常会导致“不会低于 ~58”的行为。setMinimumSectionSize(1) 解决了这个。

另外,如果你想让所有单元格始终可见,只有在以下条件成立时才有可能:

  • 窗口足够大 或者
  • 你允许单元格变得非常小。

如果行/列太多,Qt无法在没有滚动条的情况下自动让它们保持可读。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章