如何在 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 中进行基于状态的模型更改

如何从 PySide 访问 QML\QtQuick 控件?

如何在 QML QVideoFilterRunnable 中访问相机?

QML 中基于 WebSockets 的 Qt WebView 和 WebChannel

如何从 C++ 访问特定 QML 控件的事件