在使用某些文本填充tableWidget时,我已经为每一行使用了self.ui.tableWidget.resizeRowToContents
。
在此之后: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
遍历所有行。
如何捕获该信号?
答案 0 :(得分:4)
无需为添加的每一行调用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)
答案 1 :(得分: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时,用户对大小的控制被禁用。只要您的用户没有打算/需要手动调整大小 - 这是一个很好的方法。