Как переопределить сортировку конкретного столбца QTableWidget?
В столбце могут присутствовать только определенные строки.
Есть набор строк, например, "да", "нет", "не знаю", "абсолютно"... - и только такие значения могут быть в столбце.
Нужно, чтобы сортировка шла не по лексикографическому порядку, а так, как я задам.
То есть, если я задам, что по возрастанию это так:
абсолютно -> нет -> не знаю -> да
то так и должно отсортировать (сначала идут строки, где в этом столбце значения "абсолютно", потом "нет" и т.д.)
По убыванию соответственно в обратном порядке.
Как тогда мне нужно переопределить сортировку этого столбца?
Viktor T2, работает, спасибо, одной проблемой меньше.
Но как все же мне эту функцию привязать именно на сортировку определенного столбца таблицы?
Именно на метод sortItems
import sys
from PyQt5 import QtCore, QtWidgets
class NumericItem(QtWidgets.QTableWidgetItem):
""" QTableWidgetItem с перегруженым оператором сравнения """
""" Каждый элемент item имеет набор связанных с ним элементов данных data,
каждый со своей ролью. Роли используются представлением, чтобы указать тип данных. """
def __lt__(self, other):
""" Перегружает оператор сравнения data в QTableWidgetItem """
return (self.data(QtCore.Qt.UserRole) < other.data(QtCore.Qt.UserRole))
app = QtWidgets.QApplication(sys.argv)
tableWidget = QtWidgets.QTableWidget(15,3)
tableWidget.setGeometry(400, 100, 400, 550)
tableWidget.setSortingEnabled(False)
# Заполняем первый столбец как обычно
for i, e in enumerate('ABCDEFGHIJKLMNO'):
item = QtWidgets.QTableWidgetItem(e)
tableWidget.setItem(i, 0, item)
l = ['не знаю', 'абсолютно', 'нет', 'абсолютно', 'не знаю', 'абсолютно', 'да',
'не знаю', 'абсолютно', 'да', 'не знаю', 'нет', 'абсолютно', 'нет', 'да']
def mysortorder(e):
""" каждому слову назначаем вес """
ves = {'абсолютно':3, 'нет':4, 'да':20, 'не знаю':1}
return ves[e]
# Заполняем второй столбец с нашей кастомной сортировкой
for row, val in enumerate(l):
item = NumericItem(val) # Это QTableWidgetItem с перегруженым оператором сравнения
item.setData(QtCore.Qt.UserRole, mysortorder(val)) # В data записываем число - вес
tableWidget.setItem(row, 1, item)
tableWidget.setSortingEnabled(True)
tableWidget.sortItems(0, QtCore.Qt.AscendingOrder)
tableWidget.show()
sys.exit(app.exec_())
Viktor T2, мне надо в l сначала все значения столбца что ли поместить?
сортировать, если что, нужно 4-й столбец, в столбце могут быть тысячи значений
и сортировка вообще не сразу при заполнении нужна, а потом по нажатию
ZIK1337,
l - список, это для примера.
Я не знаю как вы таблицу заполняете.
Показан принцип.
Сортировка по нажатию работает.
tableWidget.sortItems(0, QtCore.Qt.AscendingOrder) тоже для примера,
можно убрать
Viktor T2, вроде разобрался и работает, спасибо
если вдруг кому-то нужно подробнее, то вот
Объявлял класс
class NumericItem(QtWidgets.QTableWidgetItem):
""" QTableWidgetItem с перегруженым оператором сравнения """
""" Каждый элемент item имеет набор связанных с ним элементов данных data,
каждый со своей ролью. Роли используются представлением, чтобы указать тип данных. """
def __lt__(self, other):
""" Перегружает оператор сравнения data в QTableWidgetItem """
return (self.data(QtCore.Qt.UserRole) < other.data(QtCore.Qt.UserRole))
Затем в месте заполнения столбца написал (ну и во всех других местах также, меняя текст):