E 'possibile ordinare i numeri in una colonna QTreeWidget?
-
21-08-2019 - |
Domanda
Ho un QTreeWidget con una colonna riempita con alcuni numeri, come posso ordinarli?
Se uso setSortingEnabled (true); Posso sorta correttamente solo stringhe, quindi la mia colonna viene ordinata:
1 10 100 2 20 200
, ma non è questa la cosa che voglio! Suggerimenti?
Soluzione
È possibile ordinare sovrascrivendo il In questo esempio ignorare il caso reale, affrontando i campi in modalità lettere minuscole. 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();
}
};
Altri suggerimenti
Ecco un'implementazione PyQt utilizzando __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()
Il modo migliore che ho trovato è quello di utilizzare un blocco try per trovare i numeri
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)
numeri ordina in valore numerico, ma stringhe ordinare in senso opposto (cioè "19999" < "2"
).
In particolare, le stringhe vengono confrontate carattere per carattere da sinistra verso destra fino a quando uno o uno degli altri caratteri differiscono, a quel punto il confronto viene arrestato. Per esempio, 19
e 121
verranno confrontati in questo modo:
"19"[0] != "121"[0] ? // no
"19"[1] != "121"[1] ? // yes
'9' > '2' ? // yes
return some value that indicates "19" greater than "121";
Per ordinare correttamente è necessario convertirli al valore numerico e poi ordinarli. Diverso da quello che è possibile implementare il proprio algoritmo di ordinamento che legge i numeri il modo corretto.