QTableWidget 在调整内容时尊重跨度

Posted

技术标签:

【中文标题】QTableWidget 在调整内容时尊重跨度【英文标题】:QTableWidget respect span when sizing to contents 【发布时间】:2018-09-04 12:37:06 【问题描述】:

如果我有一个QTableWidget,并且我使用setSpan 设置单元格的列跨度,Qt 会调整表格的大小,就好像单元格的内容完全在扩展单元格的第一列中一样。

from PyQt5 import QtWidgets, QtCore
import sys

class myMainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(myMainWindow, self).__init__()
        tableBoxWidget = QtWidgets.QWidget(self)
        tableBox = QtWidgets.QHBoxLayout(tableBoxWidget)
        self.setCentralWidget(tableBoxWidget)
        self.setMinimumWidth(750)
        tableBoxWidget.setContentsMargins(20,20,20,20)

        testTable = QtWidgets.QTableWidget(tableBoxWidget)
        tableBox.addWidget(testTable)

        testTable.setFocusPolicy(QtCore.Qt.NoFocus)
        testTable.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection)

        testTable.setRowCount(3)
        testTable.setColumnCount(2)

        # setting column 1 resize to contents
        testTable.horizontalHeader().setStretchLastSection(False)
        testTable.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)

        longString = "abcdefghijklmnopqrstuvwxyz"
        shortString = "abc"

        #first row
        testTable.setItem(0, 0, QtWidgets.QTableWidgetItem(shortString))
        testTable.setItem(0, 1, QtWidgets.QTableWidgetItem(longString))

        #second row, two-column span
        testTable.setSpan(1, 0, 1, 2)
        testTable.setItem(1, 0, QtWidgets.QTableWidgetItem(longString))

        #third row, same as first
        testTable.setItem(2, 0, QtWidgets.QTableWidgetItem(shortString))
        testTable.setItem(2, 1, QtWidgets.QTableWidgetItem(longString))

        self.show()



app = QtWidgets.QApplication(sys.argv)
window = myMainWindow()
app.exec_()

但是有没有办法强制 Qt 考虑跨单元格提供的额外空间?

【问题讨论】:

【参考方案1】:

我遇到了很多麻烦,我无法为我的表格项目获取有效的 sizeHints,并且用于获取项目大小的 QTableVeiew 方法在 Qt 源代码中似乎是私有的。因此,这排除了根据单个项目的宽度调整列的大小(即忽略/考虑跨项目)。

一种解决方法是隐藏任何跨项目导致问题的行,调整内容的大小,然后再次显示它们。这要求您知道哪些行包含跨区项目(对我来说这很容易,因为它始终位于最上面一行)。

        self.setRowHidden(0, True)
        for col in range(self.columnCount()):
            self.resizeColumnToContents(col)
        self.setRowHidden(0, False)

self 是一个 QTableWidget

【讨论】:

以上是关于QTableWidget 在调整内容时尊重跨度的主要内容,如果未能解决你的问题,请参考以下文章

QTableWidget 列跨度未正确调整大小

qt中QTableWidget怎么根据内容自动调整列宽行高?

调整列大小时 C++ Qt QTableWidget 项目移动

Qt QTableWidget 列调整大小

调整窗口大小时如何将跨度的内容保持在一起(如何在跨度边界处“断字”)?

涉及行跨度时,根据内容自动调整 HTML 表格单元格的高度