Frage

Ich bin eine Unterklasse von QAbstractItemModel Erstellung in einem QTreeView angezeigt werden.

Meine index() und parent() Funktion erstellt die QModelIndex die QAbstractItemModel geerbt Funktion createIndex verwenden und die row, column Bereitstellung und data benötigt. Hier für Testzwecke, Daten ist ein Python-String.

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>"

Innerhalb der index(), parent() und data() Funktionen, die ich brauche, um meine Daten wieder zu bekommen. Es kommt als QVariant. Wie erhalte ich mein Python-Objekt zurück vom QVariant?

War es hilfreich?

Lösung 2

Das Wichtigste ist internalPointer() direkt am QModelIndex zu verwenden, nicht mit den QVariant überhaupt zu tun.

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

Andere Tipps

Haben Sie versucht das?

my_python_object = my_qvariant.toPyObject()

http://pyqt.sourceforge.net/Docs/PyQt4/qvariant .html # toPyObject (nur der Vollständigkeit halber, aber es gibt es nicht viel zu sehen ...)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top