我有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()
请帮助我,我是个菜鸟。
答案 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)
之前......这解决了我的问题。