Можно ли отсортировать числа в столбце QTreeWidget?
-
21-08-2019 - |
Вопрос
У меня есть QTreeWidget со столбцом, заполненным некоторыми числами, как я могу их отсортировать?
Если я использую setSortingEnabled(true);Я могу правильно сортировать только строки, поэтому мой столбец отсортирован:
1 10 100 2 20 200
но это не то, чего я хочу!Предложения?
Решение
Вы можете выполнить сортировку, переопределяя < оператор и изменение условия сортировки следующим образом.
class TreeWidgetItem : public QTreeWidgetItem {
public:
TreeWidgetItem(QTreeWidget* parent):QTreeWidgetItem(parent){}
private:
bool operator<(const QTreeWidgetItem &other)const {
int column = treeWidget()->sortColumn();
return text(column).toLower() < other.text(column).toLower();
}
};
В этом примере он игнорирует реальный регистр, сопоставляя поля в нижнем регистре.
Другие советы
Вот реализация PyQt, использующая __lt__
class TreeWidgetItem(QtGui.QTreeWidgetItem):
def __init__(self, parent=None):
QtGui.QTreeWidgetItem.__init__(self, parent)
def __lt__(self, otherItem):
column = self.treeWidget().sortColumn()
return self.text(column).toLower() < otherItem.text(column).toLower()
Лучший способ, который я нашел, - это использовать блок try для поиска чисел
class TreeWidgetItem( QtGui.QTreeWidgetItem ):
def __init__(self, parent=None):
QtGui.QTreeWidgetItem.__init__(self, parent)
def __lt__(self, otherItem):
column = self.treeWidget().sortColumn()
try:
return float( self.text(column) ) > float( otherItem.text(column) )
except ValueError:
return self.text(column) > otherItem.text(column)
числа сортируются по числовому значению, но строки сортируются противоположным образом (т.е. "19999" < "2"
).
Более конкретно, строки сравниваются посимвольно слева направо до тех пор, пока один или другие символы не будут отличаться, после чего сравнение прекращается.Например, 19
и 121
будет сравниваться следующим образом:
"19"[0] != "121"[0] ? // no
"19"[1] != "121"[1] ? // yes
'9' > '2' ? // yes
return some value that indicates "19" greater than "121";
Чтобы отсортировать их правильно, вам нужно будет преобразовать их в числовое значение, а затем отсортировать.Кроме этого, вы могли бы реализовать свой собственный алгоритм сортировки, который правильно считывает числа.