Я хотел бы сохранить этот элемент «Выбрать все» закрепленным сверху, а затем отсортировать все остальные элементы ниже в алфавитном порядке. .
Я попытался создать РОЛЬ для элемента «Выбрать все», чтобы указать, что этот элемент всегда должен быть сверху. Поэтому я переопределяю метод lt, чтобы он возвращал False всякий раз, когда включена Skip_sorting, иначе сортируем в алфавитном порядке (см. код ниже).
Проблема, с которой я сталкиваюсь, заключается в том, что если я печатаю сравнения, которые вызываются ( print(self.text(column),other.text(column))), self всегда является элементом «Выбрать все», но я не вижу сравнения между другими элементами. Я использую pyside6 6.3.2
Код: Выделить всё
class TreeWidgetItem(QTreeWidgetItem):
"""
Sort items alphabetically but exclude the "Select All" on top
"""
def __lt__(self, other):
column = self.treeWidget().sortColumn()
print(self.text(column), other.text(column))
skip_sorting_self = self.data(column, _SKIP_SORT_ROLE)
skip_sorting_other = other.data(column, _SKIP_SORT_ROLE)
if skip_sorting_self and not skip_sorting_other:
return False
return self.text(column).lower() < other.text(column).lower()

Обновление:
Вот рабочий пример того, что не работает:
Код: Выделить всё
import sys
from typing import Optional
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication, QTreeWidget, QTreeWidgetItem, QWidget
_SKIP_SORT_ROLE: int = (Qt.UserRole + 4)
class TreeWidgetItem(QTreeWidgetItem):
"""
Sort items alphabetically but exclude the Select All
"""
def __lt__(self, other):
column = self.treeWidget().sortColumn()
skip_sorting_self = self.data(column, _SKIP_SORT_ROLE)
text = self.text(column)
if skip_sorting_self:
text = '' # lowest possible
return text > other.text(column).lower()
class TreeWidget(QTreeWidget):
def __init__(self, parent: Optional[QWidget] = None):
super(TreeWidget, self).__init__(parent)
item = TreeWidgetItem(self)
item.setText(0, 'Select All')
item.setData(0, _SKIP_SORT_ROLE, True)
for i in range(10):
item = TreeWidgetItem(self)
item.setText(0, f'Item {i}')
for i in range(10):
item = TreeWidgetItem(self)
item.setText(0, f'Item {i}')
self.setSortingEnabled(True)
if __name__ == '__main__':
app = QApplication(sys.argv)
tree = TreeWidget()
tree.show()
sys.exit(app.exec())

Подробнее здесь: https://stackoverflow.com/questions/791 ... t-one-item