2010-10-25 61 views
3

我有一個應用程序,我在PySide中編寫了一個QML UI。我已經在Python子類QAbstractListModel:如何將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 

我公司提供的模型,我的QML在主腳本這樣做:

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

Qt's docs say,該模型的角色名被用來從QML訪問數據,和一個可以指正常的DisplayRole在QML爲「顯示」,因此我QML具有用簡單的代表這樣一個ListView:

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

然而,當我這樣做的結果是file:///foo/bar/main.qml:28: ReferenceError: Can't find variable: display

在模型中設置自定義角色名稱無濟於事。想法?

+0

好像我的模式沒有被正確地QML使用,因爲之後我添加了一些記錄到rowCount時(),我發現它沒有被稱爲:/這可能是根本原因則。我仍然不知道爲什麼。 – Ilkka 2010-10-25 10:35:17

+0

我從rowCount()中刪除了父索引有效性檢查,這實際上似乎修復了項目(beginInserRows(...)... endInsertRows())的動態添加。我沒有在這裏顯示,因爲我覺得這是無關緊要的。 – Ilkka 2010-10-26 06:55:25

+0

我一直試圖讓這個工作呢!我一直在關注http://doc.qt.nokia.com/4.7/qdeclarativemodels.html示例,我還沒有找到相同的pyside。你有沒有嘗試設置委託文本{text:modelData}請參閱:http://www.qt.gitorious.org/pyside/pyside-examples/commit/419a83371ba4b4c333559c25bcb7069924b4a227 – jonmiddleton 2010-10-26 07:42:51

回答

相關問題