QHeaderView:根据列内容大小进行拉伸或自适应调整大小

3
我有一个 QTableWidget,其中包含一个最后一列,该列包含长度可变的文本。
我想要根据该部分的大小将 QHeaderView 的最后一节拉伸或调整大小以适应其内容。如果内容大小未超过小部件中的剩余空间,则我希望将其拉伸(以防止小部件中出现丑陋的未填充空间)。我可以通过使用 setStretchLastSection(True) 来实现这一点。但是,如果内容大小超过了拉伸的列,我的内容的最后一部分就会被裁剪,因为列没有被调整大小。QHeaderView 为此情况提供了 ResizeToContents ResizeMode,但在短内容的情况下,这会导致小部件中出现未填充的空间。
我考虑手动调整列宽。不幸的是,我不能直接访问内容大小,因为 sectionSizeFromContents() 是受保护的。我想我可以子类化 QHeaderView 并重新实现它,但我想知道是否有更好的解决方法。

受保护的方法在pyqt中是可访问的。如果您不使用Python,请从问题中删除pyqt标签。 - ekhumoro
我正在使用pyqt5。当尝试调用sectionSizeFromContents()时,我会收到以下异常:RuntimeError: no access to protected functions or signals for objects not created from Python - tsabsch
1
是的,只需创建一个 QHeaderView 的实例并将其设置到表格上即可。无需创建子类。 - ekhumoro
哦,我不知道这会有所不同。我确实可以通过自己创建一个实例来访问该方法。然而,我误解了sectionSizeFromContents()的功能,但是我可以使用其他函数来解决我的问题。 - tsabsch
1个回答

6
我曾经误解了QHeaderView::sectionSizeFromContents()的功能。我以为它会返回属于该部分的单元格的大小,但是这些信息显然无法存储在标题中。相反,它返回标题内容的大小,即给定标签的大小。
然而,可以通过QTableWidget::sizeHintForColumn()获取列的内容大小。我的表格只有两列,因此要计算第二列的剩余空间,我可以使用以下方法:
stretched_size = table.viewport().size().width() - table.horizontalHeader().sectionSize(0)

这个大小等于在ResizeMode::Stretch模式下的列大小。因此,我可以通过将分段大小设置为最大的拉伸大小和列大小提示之间的值来解决我的问题:

size = max(table.sizeHintForColumn(1), stretched_size)
table.horizontalHeader().resizeSection(1, size)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接