2010-02-25 21 views
5

Je crée une sous-classe de QAbstractItemModel à afficher dans un QTreeView.Comment récupérer mon objet python d'un QVariant dans PyQt4?

Ma fonction index() et parent() crée le QModelIndex en utilisant la fonction héritée QAbstractItemModelcreateIndex 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 data() fonctions que je dois récupérer mes données. Il s'agit d'un QVariant. Comment récupérer mon objet Python à partir de QVariant?

Répondre

4

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