在QTableView中的所有单元格(不仅显示)上重新实现sizeHintForColumn()以调整ColumnsTo



我正在开发一个PyQt应用程序,该应用程序具有QTableWidget,可能用于显示大量行。我希望每个列宽都由整列的最大元素宽度来定义,而不仅仅是由将单元格数据编程添加到表小部件时显示的最大元素来定义。

resizeColumnToContents()方法描述中的Qt文档声明

只有可见列的大小才会调整。将sizeHintForColumn()重新实现为调整隐藏列的大小。

问题是,我究竟应该如何正确地做到这一点?不幸的是,我在PyQt方面没有真正的经验,我也找不到这种方法的任何来源,无法为我提供如何做到这一点的线索。

是否可以根据在任何给定时刻显示的当前内容调整大小,即在表小部件收到任何paintEvents后调整大小?

您只需要子类化QTableWidget并覆盖sizeHintForColumn方法,返回一个整数,该整数描述您想要的像素宽度。您可以在最长的字符串上使用QFontMetrics的width方法来计算宽度。

class MyTable(QtGui.QTableWidget):
    def sizeHintForColumn(self, column):
        fm = self.fontMetrics()
        max_width = 0
        for i in range(self.rowCount()):
            width = fm.width(self.item(i,column).text()) + 10
            if  width > max_width:
                max_width = width
        return max_width

如果您要添加大量元素并在之后调用resizeColumnToContents,那么您可能希望以某种方式存储结果。这样,您就不必每次都在所有行上循环。

最新更新