1

在用我self.ui.tableWidget.resizeRowToContents为每一行使用的一些文本填充 tableWidget 时。之后:self.ui.tableWidget.setSortingEnabled(1),排序按预期工作,但行不再根据内容调整大小,实际上它们保留了以前的高度。

name                              name v                 name v
---------                         ---------              ---------
text2                             text1line1             text1line1
---------  after sort is clicked: ---------   expected:  text1line2
text1line1                                               text1line3
text1line2                        text2                  ---------
text1line3                                               text2
---------                         ---------              ---------

我的想法是在单击标题排序时捕获信号,然后再次self.ui.tableWidget.resizeRowToContents 遍历所有行。 如何捕捉到这个信号?

4

2 回答 2

5

无需resizeRowToContents为添加的每一行调用。

相反,在表格填满后,调用resizeRowsToContents插槽,它将一次调整所有行的大小。

然后,您可以将同一插槽连接到sortIndicatorChanged信号,以便在对列进行排序时调整行的大小:

# ... fill table, then:
self.ui.tableWidget.setSortingEnabled(True)
self.ui.tableWidget.resizeRowsToContents()
self.ui.tableWidget.horizontalHeader().sortIndicatorChanged.connect(
    self.ui.tableWidget.resizeRowsToContents)
于 2012-09-05T18:42:05.040 回答
1

您可以连接到的标头对象上有信号:http: //doc.qt.nokia.com/4.7-snapshot/qheaderview.html

header = self.ui.tableWidget.horizontalHeader()
header.sortIndicatorChanged.connect(self.fixRowSizes)

您还可以尝试在填充时为行设置调整大小模式:

# grab the header object
row_header = self.ui.tableWidget.verticalHeader()

# populate some data
self.ui.tableWidget.setRowCount(100)
self.ui.tableWidget.setColumnCount(100)
for row in range(100):
    for col in range(100):
        self.ui.tableWidget.setItem(row, col, QTableWidgetItem(str(row * col)))

    # mark each row to automatically resize to contents
    row_header.setResizeMode(row, QHeaderView.ResizeToContens)

这种方法的缺点是当设置为 ResizeToContents 时,用户对大小的控制被禁用。只要您的用户不打算/不需要手动调整大小 - 这是一个很好的方法。

于 2012-09-05T17:23:29.153 回答