如何在 QML 中访问基于 QObjectList 的模型中的某些元素
Posted
技术标签:
【中文标题】如何在 QML 中访问基于 QObjectList 的模型中的某些元素【英文标题】:How to access certain element in a QObjectList-based model in QML 【发布时间】:2017-07-13 06:10:06 【问题描述】:假设在 C++ 端,我创建了一个 QList<QObject *> myObjects
,其中包含几个从 QObject
派生的自定义对象。
然后通过setContextProperty( "myModel", QVariant::fromValue( myObjects ) );
将其暴露给QML
问题是,在我的 QML 代码中,如何获取和使用 myModel
(即 QList
)中的特定元素(按索引)。例如,我想从列表中取出一个随机元素并显示它?
示例在这里:http://doc.qt.io/qt-5/qtquick-models-objectlistmodel-example.html,其中模型的所有元素都显示在 ListView` 中,而我只想显示其中的一个(或几个)。
【问题讨论】:
QML 透明地支持QList<>
类型,如this 文档中所述。所以 C++ 数组将被转换为普通的 javascript 数组。看到它here
这么简单和基本的问题,但这是一个必要的问题。所以+1 :)
【参考方案1】:
很简单……
从模型中获取项目编号 i:
myModel[i]
并访问其属性/角色:
myModel[i].propertyName
【讨论】:
简单明了的答案。也不要忘记在main.cpp
文件中注册 qml 类型以使其在 qml 中可访问。请参阅文档。【参考方案2】:
要从列表中获取项目,您可以使用[]
运算符:
myModel[index]
QList
的元素类似于 javascript 中的数组,因为 QML 是基于后者。
以下示例显示了以随机形式获取名称(它仅替换示例中的代码)。
view.qml
import QtQuick 2.0
import QtQuick.Layouts 1.3
import QtQuick.Controls 1.4
//![0]
ColumnLayout
ListView
width: 100; height: 100
model: myModel
delegate: Rectangle
height: 25
width: 100
color: model.modelData.color
Text
text: name
Button
text: "random"
onClicked:
t.text = myModel[ Math.floor(Math.random()*myModel.length)].name;
Text
id: t
text: ""
【讨论】:
以上是关于如何在 QML 中访问基于 QObjectList 的模型中的某些元素的主要内容,如果未能解决你的问题,请参考以下文章
如何在 QML 中访问 C++ 类对象,而不是在 QML 中创建单独的对象?
如何在 QML QVideoFilterRunnable 中访问相机?