2010-10-25 21 views
3

J'ai une application que j'écris dans PySide qui a une interface QML. J'ai sous-classé QAbstractListModel en Python:Comment fournir des données de la sous-classe PySide QAbstractItemModel à QML ListView?

class MyModel(QtCore.QAbstractListModel): 
    def __init__(self, parent=None): 
     QtCore.QAbstractListModel.__init__(self, parent) 
     self._things = ["foo", "bar", "baz"] 

    def rowCount(self, parent=QtCore.QModelIndex()): 
     return len(self._things) 

    def data(self, index, role=QtCore.Qt.DisplayRole): 
     if role == QtCore.Qt.DisplayRole: 
      return self._things[index.row()] 
     return None 

je fournir le modèle à mon QML en faisant cela dans le script principal:

model = MyModel() 
view.rootContext().setContextProperty("mymodel", model) 

Qt's docs say que les noms de rôle du modèle sont utilisés pour accéder aux données de QML et que l'on peut se référer à la normale dans DisplayRole QML comme « affichage », donc mon QML a un ListView avec un délégué simple comme ceci:

ListView { 
     anchors.fill: parent 
     model: mymodel 
     delegate: Component { Text { text: display } } 
} 

Toutefois, lorsque Je fais cela le résultat est file:///foo/bar/main.qml:28: ReferenceError: Can't find variable: display.

La définition de noms de rôles personnalisés dans le modèle n'aide pas. Des idées?

+0

Il semble que mon modèle n'est pas correctement utilisé par le QML, car après avoir ajouté une exploitation forestière à rowCount(), je l'ai remarqué est pas appelé:/C'est probablement la cause racine alors. Je ne sais toujours pas pourquoi. – Ilkka

+0

J'ai supprimé la vérification de la validité de l'index parent de rowCount(), qui semble effectivement corriger l'ajout dynamique d'éléments (beginInserRows (...) ... endInsertRows()). Je ne montre pas cela un peu ici parce que je pense que ce n'est pas pertinent. – Ilkka

+0

J'ai essayé de faire fonctionner ça aussi! J'ai suivi l'exemple de http://doc.qt.nokia.com/4.7/qdeclarativemodels.html, je n'ai pas trouvé d'équivalent en pyside. Avez-vous essayé de définir le délégué Text {text: modelData} voir: http://www.qt.gitorious.org/pyside/pyside-examples/commit/419a83371ba4b4c333559c25bcb7069924b4a227 – jonmiddleton

Répondre