Pregunta

No puedo insertar correctamente un QtreeWidgetItem en un índice específico, en este caso, estoy eliminando todos los QtreeWidgetItems del árbol, haciendo un tipo personalizado en sus objetos de fecha y luego insertándolos en el QtreeWidget.

Sin embargo, al insertar (incluso uno a la vez), el QtreeWidgetItem no se inserta en el lugar correcto.

El código a continuación se imprime:

índice 0: 0

índice 0: 1 ÍNDICE 1: 0

índice 0: 2 ÍNDICE 1: 1 ÍNDICE 2: 0

índice 0: 3 ÍNDICE 1: 2 ÍNDICE 2: 0 ÍNDICE 3: 1

índice 0: 4 ÍNDICE 1: 2 ÍNDICE 2: 0 ÍNDICE 3: 1 ÍNDICE 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])
¿Fue útil?

Solución

Puede hacer su tipo personalizado sin necesidad de rellenar el árbol. Solo necesita sobrecargar el operador 'menos' del elemento. Tenga en cuenta que QT se resuelve, qué dibujar en la celda, qué tamaño debe ser, qué texto debe contener, mirando en elementos

virtual QVariant data ( int column, int role ) const

Cuando crea un elemento, proporciona alguna cadena al constructor para que se muestre el elemento. Esta cadena se coloca en datos (.., qtcore.qt.editrole), por lo tanto, el equivalente de pasar datos al constrictor es establecer datos con:

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

Internamente, los datos son solo una matriz, puede colocar cualquier cosa que jubilen, y los índices son roles (Qt.editrole es 2, Qt.Tooltiprole es 3, etc.), por lo que dejamos que algún papel contenga nuestros datos, diga la comparación Operador para comparar estos valores y decir SetData Set DisplayRole cuando establezcamos nuestro, Digamos, Valuerola. Aquí está la muestra:

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

He probado, funciona bien. De Cource, puede evitar la herencia y anular teniente Directamente, ya que teníamos una escritura de pato, use Userrole en sí para mantener sus datos y SET DATS se muestre directamente con SetData (Col, Rol, Val), o incluso mantenga solo texto en Editar/Mostrar rol y convertirlos en DateTime solo al comparar, Pero parece feo. Tenga en cuenta que los datos () contienen qvariant. Cuando establece datos, su objeto PY se convierte automatamente, y debe llamar a TopyObject () para recuperar su valor como estaba.

Otros consejos

El problema debe estar en otra parte de su código. ¿Quizás no estés quitando los artículos correctamente? Porque lo siguiente funciona:

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_()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top