2013-07-03 30 views
0

我QTableWidget的被填充有可檢查項目第一列,所以我需要重載這些項目,以便能夠對它們進行排序:重載__lt__操作意外稱爲

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() 

它的工作原理是,當我點擊的標題預期該列:行被排序 - 首先檢查行,然後不檢查。

問題 occures的時候我不上任何列的標題點擊,然後使用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() 

請幫助我,我是一個noob。

回答

0

我解決了這個問題。事實證明,tableWidget.horizontalHeader().sortIndicatorSection()返回「6」,(我不知道爲什麼),但排序行爲就像它是0,因爲它是writen在文檔:

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)之前已將此行解決了我的問題。