Question

Je suis en train de créer une sous-classe de QAbstractItemModel à afficher dans un QTreeView.

Ma fonction index() et parent() crée le QModelIndex en utilisant la fonction QAbstractItemModel héritée createIndex et fournissant le row, column et data nécessaires. Ici, à des fins de test, les données sont une chaîne 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>"

Dans les index(), parent(), et les fonctions de data() que je dois récupérer mes données. Il se présente comme un QVariant. Comment puis-je obtenir mon objet Python de retour de la QVariant?

Était-ce utile?

La solution 2

L'essentiel est d'utiliser internalPointer() directement sur le QModelIndex, ne pas traiter avec le QVariant du tout.

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

Autres conseils

Avez-vous essayé?

my_python_object = my_qvariant.toPyObject()

http://pyqt.sourceforge.net/Docs/PyQt4/qvariant .html # toPyObject (juste pour être complet, mais il n'y a pas grand-chose à voir là-bas ...)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top