Pregunta

Tengo un QTreeWidget con una columna llena de algunos números, ¿cómo puedo ordenarlos?

Si uso setSortingEnabled(true);Puedo ordenar correctamente sólo cadenas, por lo que mi columna está ordenada:

1 10 100 2 20 200

¡pero esto no es lo que quiero!¿Sugerencias?

¿Fue útil?

Solución

Puede ordenar anulando el operador

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

En este ejemplo se ignore el caso real, enfrentándose a los campos en el modo de minúsculas.

Otros consejos

Aquí hay una aplicación pyqt usando __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 mejor manera que he encontrado es el uso de un bloque try para encontrar números

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)

los números se ordenan por valor numérico, pero las cadenas se ordenan de manera opuesta (es decir, "19999" < "2").

Más específicamente, las cadenas se comparan carácter por carácter de izquierda a derecha hasta que uno u otro carácter difieren, momento en el que se detiene la comparación.Por ejemplo, 19 y 121 se comparará así:

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

Para ordenarlos correctamente, deberá convertirlos al valor numérico y luego ordenarlos.Aparte de eso, podría implementar su propio algoritmo de clasificación que lea los números de la manera correcta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top