2012-09-05 20 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時,用戶對大小的控制被禁用。只要你的用戶不打算/不需要手動調整大小 - 這是一個好方法。