2012-09-05 18 views
1

使用一些文本填充tableWidget时,我已经为每一行使用了self.ui.tableWidget.resizeRowToContents。 之后和:self.ui.tableWidget.setSortingEnabled(1),排序按预期工作,但行不再调整内容的大小,实际上它们保留了以前的高度。Python-QTableWidget:单击标题中的排序时如何捕获信号

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

对于添加的每一行,没有必要调用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) 
+0

感谢,这正是我一直在寻找。 – Aleksandar

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时,用户对大小的控制被禁用。只要你的用户不打算/不需要手动调整大小 - 这是一个好方法。