0

我有 QTableWidget ,第一列填充了可检查的项目,所以我需要重载这些项目才能对它们进行排序:

class CheckBoxItem(QtGui.QTableWidgetItem): 
    def __init__(self, doSelect):
        QtGui.QTableWidgetItem.__init__(self, doSelect)
        self.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
        if doSelect:
            self.setCheckState(QtCore.Qt.Checked)
        else:
            self.setCheckState(QtCore.Qt.Unchecked)

    def __lt__(self, other):        
        return self.checkState() < other.checkState()

当我单击该列的标题时,它按预期工作:行已排序 - 首先有选中的行,然后没有选中。

当我不单击任何列的标题然后使用时会出现问题tableWidget.setSortingEnabled(1),在这种情况下__lt__,如果我有大约 15 行并随机混合一些行,而不是对它们进行排序,则会被调用 100 多次。我在打电话之前检查/取消检查了一些项目setSortingEnabled(1),但我不希望__lt__比较它们,因为我没有单击该列的标题对它们进行排序。

我有 6 列(0-5),如果我没有单击其中任何一个的标题进行排序,则tableWidget.horizontalHeader().sortIndicatorSection()返回6- 这是表外的列,这意味着该表未排序。

那么,为什么__lt__叫呢?我在覆盖它时错过了什么吗?我知道这可以解决问题(仅在单击该列的标题时才比较项目),但是如何传递sortIndicatorSection__lt__

def __lt__(self, other):
    if sortIndicatorSection==0:
         return self.checkState() < other.checkState()

请帮助我,我是菜鸟。

4

1 回答 1

0

我已经解决了这个问题。事实证明,tableWidget.horizontalHeader().sortIndicatorSection()返回 "6" (我不知道为什么)但排序的行为就像它是 0 一样,因为它是在文档中写的:

    int QHeaderView::sortIndicatorSection () const

返回具有排序指示符的节的逻辑索引。默认情况下,这是第 0 节。

这可能是因为我有 tableWidget 而不是 tableView。

所以我发现了这个:

void QHeaderView::setSortIndicator ( int logicalIndex, Qt::SortOrder order )

在 order 指定的方向上为给定 logicalIndex 指定的部分设置排序指示符,并从显示它的任何其他部分中删除排序指示符。

logicalIndex 可能为 -1,在这种情况下,将不显示排序指示符,模型将返回其自然的、未排序的顺序。请注意,并非所有型号都支持这一点,在这种情况下甚至可能会崩溃。

它适用于 QTableWidget。我已经在填充表格之前放置了这一行tableWidget.horizontalHeader().setSortIndicator(-1, QtCore.Qt.AscendingOrder) ......这解决了我的问题。

于 2013-07-12T10:40:28.883 回答