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

时间:2011-06-20 17:55:13

标签: pyqt

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

resizeColumnToContents()方法描述中的Qt docs说明

  

仅调整可见列的大小。   重新实现sizeHintForColumn()   调整隐藏列的大小。

问题是,我究竟应该如何正确地做到这一点?不幸的是,我没有PyQt的实际经验,而且我无法找到任何这种方法的来源给我任何关于我应该怎么做的线索。

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

1 个答案:

答案 0 :(得分:6)

您只需要子类化QTableWidget并覆盖sizeHintForColumn方法,返回一个描述所需宽度的整数。您可以使用最长字符串QFontMetricswidth方法计算宽度。

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,你可能会想要以某种方式存储结果。这样,您不必每次都遍历所有行。