Domanda

Non sono in grado di inserire correttamente un QtreewidgetItem in un indice specifico, in questo caso sto rimuovendo tutti i QtreewidgetItems dall'albero, facendo un ordinamento personalizzato sugli oggetti della data e poi inserendoli nel QtreewIdget.

Tuttavia, dopo aver inserito (anche uno alla volta) il QtreewidgetItem non viene inserito nel luogo corretto.

Il codice di seguito stampato:

INDICE 0: 0

INDICE 0: 1 Indice 1: 0

INDICE 0: 2 Indice 1: 1 Indice 2: 0

INDICE 0: 3 Indice 1: 2 Indice 2: 0 Indice 3: 1

INDICE 0: 4 Indice 1: 2 Indice 2: 0 Indice 3: 1 Indice 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])
È stato utile?

Soluzione

Puoi fare il tuo tipo personalizzato senza la necessità di riempire l'albero. Devi solo sovraccaricare l'operatore "less" degli articoli. Nota, che QT capisca, cosa disegnare nella cella, che dimensione dovrebbe essere, quale testo dovrebbe contenere, guardando negli articoli

virtual QVariant data ( int column, int role ) const

Quando si crea un elemento, si fornisce una stringa al costruttore da mostrare. Questa stringa viene inserita in dati (.., qtcore.qt.editrole), quindi l'equivalente di passare i dati nel costuttore è impostare i dati con:

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

Internamente, i dati sono solo un array, puoi posizionare qualsiasi cosa il giovane e gli indici sono ruoli (Qt.Editrole è 2, Qt.ToolTiprole è 3 ecc.), Quindi lasciamo solo un ruolo per contenere i nostri dati, raccontare il confronto Operatore per confrontare questi valori e raccontare SetData Set DisplayRole quando impostiamo il nostro, diciamo, Valuerole. Ecco il campione:

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

Ho testato, funziona bene. Di Cource, puoi evitare l'eredità e la sovraccarico lt Direttamente, dal momento che avevamo la tipizzazione delle anatre, usa l'utente stesso per tenere i dati e i dati impostati visualizzano direttamente con setData (col, ruolo, val) o persino tenere solo testo nel ruolo di modifica/visualizzazione e convertilo in DateTime solo durante il confronto, confrontando, Ma sembra brutto. Nota, quel data () contiene Qvariant. Quando si imposta i dati, il tuo oggetto PY si converte automaticamente e devi chiamare topyObject () per riavere il tuo valore così com'era.

Altri suggerimenti

Il problema deve essere altrove nel tuo codice. Forse non stai rimuovendo gli oggetti correttamente? Perché le seguenti funziona:

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_()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top