Question

J'ai un QTreeWidget avec une colonne remplie de quelques chiffres, comment puis-je les trier?

Si je setSortingEnabled (true); Je ne peux que les chaînes de tri correctement, donc ma colonne est triée:

1    dix    100    2    20    200

mais ce n'est pas la chose que je veux! Suggestions?

Était-ce utile?

La solution

Vous pouvez trier remplaçant l'opérateur

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

Dans cet exemple, ignorer le cas réel, face à des champs en mode minuscules.

Autres conseils

Voici une implémentation en utilisant 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()

La meilleure façon que j'ai trouvé est d'utiliser un bloc try pour trouver des numéros

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)

chiffres trier par valeur numérique, mais les chaînes de tri dans le sens opposé (à savoir "19999" < "2").

Plus précisément, les chaînes sont comparées caractère par caractère de gauche à droite jusqu'à ce qu'un un ou les autres personnages diffèrent, à quel point l'est arrêté comparision. Par exemple, et 19 sera comparé 121 comme ceci:

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

Pour les trier correctement, vous aurez besoin de les convertir à la valeur numérique, puis les trier. Autre que vous pouvez implémenter votre propre algorithme de tri qui lit les numéros dans le bon sens.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top