Pregunta

Estoy creando una subclase de QAbstractItemModel que se mostrará en una QTreeView.

Mi index() y parent() función crea el QModelIndex utilizando el QAbstractItemModel heredada createIndex función y dotándola de la row, column y data necesario. En este caso, para propósitos de prueba, los datos es una cadena de Python.

class TestModel(QAbstractItemModel):
    def __init__(self):
        QAbstractItemModel.__init__(self)

    def index(self, row, column, parent):
        if parent.isValid():
            return self.createIndex(row, column, "bar")
        return self.createIndex(row, column, "foo")

    def parent(self, index):
        if index.isValid():
            if index.data().data() == "bar":                          <--- NEVER TRUE
                return self.createIndex(0, 0, "foo")
        return QModelIndex()

    def rowCount(self, index):
        if index.isValid():
            if index.data().data() == "bar":                          <--- NEVER TRUE
                return 0
        return 1

    def columnCount(self, index):
        return 1

    def data(self, index, role):
        if index.isValid():
            return index.data().data()                                <--- CANNOT DO ANYTHING WITH IT
        return "<None>"

Dentro de las funciones index(), parent() y data() que necesito para obtener la espalda de datos. Viene como una QVariant. ¿Cómo consigo mi espalda objeto de Python desde el QVariant?

¿Fue útil?

Solución 2

La clave es usar internalPointer() directamente en la QModelIndex, no se trata de la QVariant en absoluto.

class TestModel(QAbstractItemModel):
    def __init__(self, plan):
        QAbstractItemModel.__init__(self)

    def index(self, row, column, parent):
        if not parent.isValid():
            return self.createIndex(row, column, "foo")
        return self.createIndex(row, column, "bar")

    def parent(self, index):
         if index.internalPointer() == "bar":
            return self.createIndex(0, 0, "foo")
        return QModelIndex()

    def rowCount(self, index):
        if index.internalPointer() == "bar":
            return 0
        return 1

    def columnCount(self, index):
        return 1

    def data(self, index, role):
        if role == 0:  # Qt.DisplayRole
            return index.internalPointer()
        else:
            return None

Otros consejos

¿Has probado esto?

my_python_object = my_qvariant.toPyObject()

http://pyqt.sourceforge.net/Docs/PyQt4/qvariant .html # toPyObject (simplemente para la corrección, pero no hay mucho que ver ...)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top