Question

Je ne peux pas à insérer un QTreeWidgetItem à un index spécifique, dans ce cas, je retire tous les QTreeWidgetItems de l'arbre, en faisant une sorte de mesure sur leur date d'objets, puis les insérer de nouveau dans le QTreeWidget.

Cependant, lors de l'insertion (même une à la fois) le QTreeWidgetItem est pas inséré dans le bon endroit.

Le code ci-dessous imprime à:

index 0: 0

index 0: 1 Indice 1: 0

index 0: 2 Indice 1: 1 Indice 2: 0

index 0: 3 Indice 1: 2 Indice 2: 0 Indice 3: 1

index 0: 4 Indice 1: 2 Indice 2: 0 Indice 3: 1 index 4: 3

print 'index 0: ', self.indexOfTopLevelItem(childrenList[0])

self.insertTopLevelItem(0, childrenList[1])

print 'index 0: ', self.indexOfTopLevelItem(childrenList[0]), ' index 1: ',\
    self.indexOfTopLevelItem(childrenList[1])

self.insertTopLevelItem(0, childrenList[2])

print 'index 0: ', self.indexOfTopLevelItem(childrenList[0]), ' index 1: ',\
    self.indexOfTopLevelItem(childrenList[1]), ' index 2: ', \
    self.indexOfTopLevelItem(childrenList[2])

self.insertTopLevelItem(0, childrenList[3])

print 'index 0: ', self.indexOfTopLevelItem(childrenList[0]), ' index 1: ',\
    self.indexOfTopLevelItem(childrenList[1]), ' index 2: ',\
    self.indexOfTopLevelItem(childrenList[2]), 'index 3: ',\
    self.indexOfTopLevelItem(childrenList[3])

self.insertTopLevelItem(0, childrenList[4])

print 'index 0: ', self.indexOfTopLevelItem(childrenList[0]),\
    ' index 1: ', self.indexOfTopLevelItem(childrenList[1]),\
    ' index 2: ', self.indexOfTopLevelItem(childrenList[2]),\
    'index 3: ', self.indexOfTopLevelItem(childrenList[3]),\
    'index 4: ', self.indexOfTopLevelItem(childrenList[4])
Était-ce utile?

La solution

Vous pouvez faire votre tri personnalisé sans besoin de remplir l'arbre. Vous avez juste besoin de surcharger l'opérateur « moins » de l'article. Notez que les chiffres QT sur, quoi dessiner dans la cellule, quelle taille il devrait être, ce texte doit-il contenir, en regardant au point de

virtual QVariant data ( int column, int role ) const

lorsque vous créez un élément, vous fournissez une chaîne à constructeur pour élément pour afficher. Cette chaîne est placé dans les données (.., QtCore.Qt.EditRole), de sorte que, soit l'équivalent de données passant dans constuctor est de définir des données avec:

virtual void setData ( int column, int role, const QVariant & value)

En interne, les données sont tout simplement un tableau, vous pouvez placer quoi que ce soit youn veulent, et les index de celui-ci sont des rôles (Qt.EditRole est 2, Qt.ToolTipRole est 3, etc.), donc nous laissons un rôle à contenir nos données , dites opérateur de comparaison pour comparer ces valeurs et dire setData mettre DisplayRole quand nous fixons notre, disons, ValueRole. Voici l'exemple:

class TreeItem(QtGui.QTreeWidgetItem):

    PythonValueRole = QtCore.Qt.UserRole

    #values are list of python objects, that have __str__ and can be compared
    def __init__(self, tree, values):
        QtGui.QTreeWidgetItem.__init__(self, tree)
        i = 0
        for v in values:
            self.setData(i, TreeItem.PythonValueRole, v)
            i += 1

    #overridden to simplify data assigning. When called with PythonValueRole, passes
    #that object's string representation to DisplayRole and EditRole
    def setData(self, col, role, value):
        if role == TreeItem.PythonValueRole:
            QtGui.QTreeWidgetItem.setData(self, col, TreeItem.PythonValueRole, value)
            # sets DisplayRole and EditRole
            QtGui.QTreeWidgetItem.setData(self, col, QtCore.Qt.EditRole, str(value)) 
            QtGui.QTreeWidgetItem.setData(self, col, QtCore.Qt.DisplayRole, str(value))
        else:
            QtGui.QTreeWidgetItem.setData(self, col, role, value)

    def __lt__(self, other):
        c = self.treeWidget().sortColumn()
        return self.data(c, TreeItem.PythonValueRole).toPyObject() < 
               other.data(c, TreeItem.PythonValueRole).toPyObject()

Je l'ai testé, il fonctionne très bien. Evidement, vous pouvez éviter l'héritage et remplacer lt directement, puisque nous avions duck typing, utilisez UserRole lui-même pour stocker vos données et ensemble de données ne s'affichent directement avec setData (col, rôle, val), ou même tenir seul texte rôle d'édition / d'affichage et de le convertir en datetime que lors de la comparaison, mais il semble laid. Notez que les données () contient QVariant. Lorsque vous définissez des données, votre objet py convertit automatcally, et vous devez appeler toPyObject () pour obtenir votre valeur de retour comme il était.

Autres conseils

Le problème doit être ailleurs dans votre code. Peut-être vous ne supprimez pas les éléments correctement? Parce que les travaux suivants:

import sys

from PyQt4.QtGui import *
from PyQt4.QtCore import *

app = QApplication(sys.argv)

tree = QTreeWidget()
items = [QTreeWidgetItem(['index %i' % i]) for i in range(5)]

for item in items:
    tree.insertTopLevelItem(0, item)

print 'indexes: '
for item in items:
    print tree.indexOfTopLevelItem(item),

tree.show()

app.exec_()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top