É possível ordenar os números em uma coluna QTreeWidget?
-
21-08-2019 - |
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?
Solução
Você pode classificar substituindo o operador Neste exemplo, ignorar o caso real, confrontando campos no modo de letras minúsculas. 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();
}
};
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.