2010-02-25 15 views
5

Estoy creando una subclase de QAbstractItemModel que se mostrará en un QTreeView.¿Cómo recupero mi objeto Python de un QVariant en PyQt4?

Mi index() y parent() función crea el QModelIndex usando la función QAbstractItemModel heredada createIndex y dotándola de la row, column y data necesario. Aquí, para fines de prueba, los datos son 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 los index(), parent() y data() funciones que necesito mis datos. Viene como QVariant. ¿Cómo recupero mi objeto Python del QVariant?

Respuesta

4

La clave es usar directamente en la internalPointer()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 
Cuestiones relacionadas