让表格尺寸随窗口自适应
在我的窗口里有一个表格,我给其中的一些单元格着色。 一切功能都正常,但我一直在努力寻找一种让表格适应窗口大小的方法。
我希望所有单元格始终可见、没有滚动条,并让它们根据表格所拥有的空间自动扩展或缩小,因为我的目标是对所有单元格一目了然。
下面是我使用的代码示例:
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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。