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