关于python:意外调用了重载的运算符

Overloaded __lt__ operator unexpectedly called

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

1
2
3
4
5
6
7
8
9
10
11
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)时,就会出现问题,在这种情况下,如果我有大约15行,并且随机混合一些行,而不进行排序,那么__lt__将被称为100+次。在调用setSortingEnabled(1)之前,我已经检查/取消选中了一些项目,但我不希望__lt__比较它们,因为我没有单击该列的标题来对它们进行排序。

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

那么,为什么叫__lt__?我在超越它的时候错过了什么吗?我认为这可以解决这个问题(仅当单击该列的标题时才比较项目),但是如何将sortIndicatorSection传递给__lt__

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

请帮帮我,我是个笨蛋。


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

1
    int QHeaderView::sortIndicatorSection () const

Returns the logical index of the section that has a sort indicator.
By default this is section 0.

这可能是因为我有TableWidget而不是TableView。

所以我发现了:

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

Sets the sort indicator for the section specified by the given
logicalIndex in the direction specified by order, and removes the sort
indicator from any other section that was showing it.

logicalIndex may be -1, in which case no sort indicator will be shown
and the model will return to its natural, unsorted order. Note that
not all models support this and may even crash in this case.

它适用于qtablewidget。我把这行放在表格被填充之前,这样解决了我的问题。