0

这是我当前的代码。

import sys

from PySide6.QtCore import Qt
from PySide6.QtWidgets import (
    QApplication,
    QProxyStyle,
    QStyle,
    QTableWidget,
    QTableWidgetItem,
)


class ProxyStyle(QProxyStyle):
    def subElementRect(self, e, opt, widget):
        r = super().subElementRect(e, opt, widget)
        if e == QStyle.SE_ItemViewItemCheckIndicator:
            r.moveCenter(opt.rect.center())
        return r


class Table(QTableWidget):
    def __init__(self):
        QTableWidget.__init__(self, 3, 1)
        self.setSortingEnabled(True)
        self._style = ProxyStyle(self.style())
        self.setStyle(self._style)
        for i in range(self.rowCount()):
            for j in range(self.columnCount()):
                it = QTableWidgetItem()
                self.setItem(i, j, it)
                it.setFlags(Qt.ItemIsEnabled | Qt.ItemIsUserCheckable)
                it.setCheckState(Qt.Checked if (i + j) % 2 == 0 else Qt.Unchecked)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = Table()
    w.show()
    sys.exit(app.exec_())

我希望当您单击列标题时,复选框按其状态排序。

如您所见, setSortingEnabled(True) 是不够的。

4

1 回答 1

1

默认情况下,QTableWidgetItem 使用文本进行比较,以便您观察此行为,如果您希望它按另一个属性排序,则必须覆盖该__lt__方法:

class CheckboxTableWidgetItem(QTableWidgetItem):
    def __lt__(self, other):
        if self.checkState() == other.checkState():
            return False
        elif self.checkState() == Qt.Checked:
            return False
        return True
for i in range(self.rowCount()):
    for j in range(self.columnCount()):
        it = CheckboxTableWidgetItem()
        self.setItem(i, j, it)
        it.setFlags(Qt.ItemIsEnabled | Qt.ItemIsUserCheckable)
        it.setCheckState(Qt.Checked if (i + j) % 2 == 0 else Qt.Unchecked)
于 2020-12-18T15:10:26.773 回答