最初の列にチェック可能なアイテムが入力された 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()
私を助けてください、私は初心者です。