意外调用了重载的__lt__运算符

时间:2013-07-03 09:31:30

标签: python qt sorting operator-overloading

我有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__被调用100次以上,如果我有~15行并随机混合一些行,而不是对它们进行排序。 我在调用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()

请帮助我,我是个菜鸟。

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题。事实证明tableWidget.horizontalHeader().sortIndicatorSection()返回“6”(我不知道为什么),但排序的行为类似于0,因为它在docs中写了:

    int QHeaderView::sortIndicatorSection () const
  

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

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

所以我发现了这个:

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

设置给定指定部分的排序指示符   logicalIndex按顺序指定的方向,并删除排序   来自显示它的任何其他部分的指标。

     

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

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