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?

È stato utile?

Soluzione

È possibile ordinare sovrascrivendo il

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 questo esempio ignorare il caso reale, affrontando i campi in modalità lettere minuscole.

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top