Pergunta

Eu tenho um QTreeWidget com uma coluna preenchida com alguns números, como pode eu meio deles?

Se eu usar setSortingEnabled (true); Eu posso classificar corretamente somente cordas, por isso a minha coluna é classificada:

1 10 100 2 20 200

mas esta não é a coisa que eu quero! Sugestões?

Foi útil?

Solução

Você pode classificar substituindo o 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();
  }
};

Neste exemplo, ignorar o caso real, confrontando campos no modo de letras minúsculas.

Outras dicas

Aqui está uma implementação 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()

A melhor maneira que eu encontrei é usar um bloco 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)

números ordenado por valor numérico, mas cordas tipo para o lado oposto (isto é "19999" < "2").

personagem Mais especificamente, as cadeias são comparadas pelo caráter da esquerda para a direita até que um um ou os outros personagens diferentes, altura em que a comparação é interrompido. Por exemplo, 19 e 121 serão comparadas assim:

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

Para classificá-los corretamente, você precisará convertê-los para o valor numérico e, em seguida, tipo-los. Diferente do que você poderia implementar seu próprio algoritmo de classificação que lê números da maneira correta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top