【问题标题】:QHeaderView: Stretch or ResizeToContents based on columns' content sizeQHeaderView:根据列的内容大小拉伸或 ResizeToContents
【发布时间】:2023-04-02 18:13:01
【问题描述】:

我有一个 QTableWidget,最后一列包含可变长度的文本。

我想根据部分的大小将 QHeaderView 的最后一部分拉伸或调整为其内容。如果内容大小不超过小部件中的剩余空间,我想拉伸它(以防止小部件中出现丑陋的未填充空间)。我可以通过使用setStretchLastSection(True) 来实现这一点。但是,如果内容大小超过了拉伸的列,我的内容的最后部分将被剪切,因为该列没有调整大小。 QHeaderView 为这种情况提供了ResizeToContents ResizeMode,但这会在内容短的情况下为小部件留下未填充的空间。

我考虑过手动调整列大小。不幸的是,我无法直接访问内容大小,因为sectionSizeFromContents() 受到保护。我想我可以继承 QHeaderView 并重新实现它,但我想知道是否有更好的解决方案。

【问题讨论】:

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

标签: qt pyqt qt5 pyqt5 qheaderview


【解决方案1】:

我误解了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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 2019-08-27
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多