Можно ли сортировать числа в столбце QTreeWidget? - PullRequest
6 голосов
/ 12 декабря 2008

У меня есть QTreeWidget со столбцом, заполненным некоторыми числами, как я могу их отсортировать?

Если я использую setSortingEnabled (true); Я могу правильно сортировать только строки, поэтому мой столбец отсортирован:

1 10 100 2 20 200

но это не то, чего я хочу! Предложения?

Ответы [ 4 ]

8 голосов
/ 14 декабря 2008

Вы можете сортировать, переопределяя оператор <и изменяя условие сортировки следующим образом. </p>

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();
  }
};

В этом примере он игнорирует реальный случай, сопоставляя поля в режиме нижнего регистра.

4 голосов
/ 22 февраля 2011

Вот реализация 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()
3 голосов
/ 27 августа 2012

Лучший способ, который я нашел, это использовать блок 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)
0 голосов
/ 12 декабря 2008

числа сортируются по числовому значению, а строки сортируются противоположным образом (т.е. "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";

Для правильной сортировки вам необходимо преобразовать их в числовое значение, а затем отсортировать. Кроме этого, вы могли бы реализовать свой собственный алгоритм сортировки, который правильно читает числа.

...