Frage

Ich habe ein QTreeWidget mit einer Spalte voller Zahlen. Wie kann ich diese sortieren?

Wenn ich setSortingEnabled(true);Ich kann nur Zeichenfolgen richtig sortieren, daher ist meine Spalte wie folgt sortiert:

1 10 100 2 20 200

aber das ist nicht das, was ich will!Vorschläge?

War es hilfreich?

Lösung

Sie können sortieren, das Überschreiben der Operator

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

In diesem Beispiel ignorieren sie den realen Fall konfrontiert Felder in Klein-Modus.

Andere Tipps

Hier ist eine pyqt Implementierung mit __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()

Die beste Weise, die ich gefunden ist, einen Try-Block zu verwenden, um Zahlen zu finden

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)

Zahlen werden nach numerischem Wert sortiert, Zeichenfolgen jedoch umgekehrt (d. h. "19999" < "2").

Genauer gesagt werden Zeichenfolgen Zeichen für Zeichen von links nach rechts verglichen, bis sich das eine oder andere Zeichen unterscheidet. An diesem Punkt wird der Vergleich abgebrochen.Zum Beispiel, 19 Und 121 wird wie folgt verglichen:

"19"[0] != "121"[0] ? // no
"19"[1] != "121"[1] ? // yes
     '9' > '2' ?      // yes
          return some value that indicates "19" greater than "121";

Um sie richtig zu sortieren, müssen Sie sie in einen numerischen Wert umwandeln und dann sortieren.Ansonsten könnten Sie Ihren eigenen Sortieralgorithmus implementieren, der Zahlen richtig liest.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top