如何将PySide QAbstractItemModel子类的数据提供给QML ListView?

3 投票
1 回答
5216 浏览
提问于 2025-04-16 06:03

我正在用PySide写一个应用程序,它的界面是用QML做的。我在Python中创建了一个QAbstractListModel的子类:

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的文档说,模型的角色名称是用来从QML中访问数据的,而且在QML中可以用“display”来引用正常的DisplayRole。因此,我的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

在模型中设置自定义角色名称也没有帮助。有什么想法吗?

1 个回答

0

你需要为模型设置角色名称,这样才能在QML中访问数据。

http://doc.qt.io/archives/qt-4.7/qabstractitemmodel.html#setRoleNames

撰写回答