Python-QTableWidget:如何在单击标题中排序时捕获信号

时间:2012-09-05 15:48:25

标签: python pyqt4 qtablewidget signal-handling

在使用某些文本填充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遍历所有行。 如何捕获该信号?

2 个答案:

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