Est-il possible de trier les numéros dans une colonne QTreeWidget?
-
21-08-2019 - |
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?
La solution
Vous pouvez trier remplaçant l'opérateur Dans cet exemple, ignorer le cas réel, face à des champs en mode minuscules. 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();
}
};
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.