检查/访问 QML 中动态创建的对象

Posted

技术标签:

【中文标题】检查/访问 QML 中动态创建的对象【英文标题】:checking/accessing dynamically created objects in QML 【发布时间】:2012-08-09 19:01:55 【问题描述】:

有没有办法检查存在和访问 QML/javascript 中动态创建的对象(不使用 C++)?

我正在尝试创建一个具有类似于地图的界面的应用程序 - 给定一个键和一个对象,我的应用程序必须定位是否存在具有该键的对象并用新对象覆盖。如果没有,应用程序必须创建一个新对象并与密钥关联。

文档说动态管理的对象没有 ID,我发现访问它们的唯一方法是使用 objectName,这似乎需要 C++ 应用程序。

提前致谢。

【问题讨论】:

【参考方案1】:

您可以将 JavaScript 对象用作地图。您不能在 QML 中直接操作它,但您可以将处理此对象的所有代码移动到 JavaScript 文件中并将其作为模块包含在内。 这是一个简单的例子:

Map.js:

var _map = new Object()

function value(key) 
    return _map[key]


function setValue(key, value) 
    _map[key] = value


function remove(key) 
    delete _map[key]


function keys() 
    return Object.keys(_map)


function process() 
    for (var key in _map) 
        /* do something */
    

QML 示例:

import QtQuick 1.1
import "Map.js" as Map

Item 
    Component.onCompleted: 
        Map.setValue("test", "hello")
        console.log("test = ", Map.value("test"))
        Map.remove("test", "hello")
        console.log("test = ", Map.value("test"))
    

输出将是:

test =  hello
test =  undefined

【讨论】:

它按预期工作!谢谢。还有没有办法遍历整个地图?我需要同时更改所有对象的值... @Ishida:是的,甚至有两种方法 :) 您可以在 Map.js 函数中定义,返回列表,包含地图中的所有键(您也可以编写函数,返回所有值,如果需要),然后处理该列表。或者您可以直接在 Map.js 中处理地图。我已经用两个函数更新了示例来迭代 Map。此外,在 process() 中,您不仅可以通过键进行迭代,还可以通过值进行迭代——只需将“for”替换为“for each”即可。

以上是关于检查/访问 QML 中动态创建的对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QML 中的同一事件之后创建/销毁动态对象?

当动态创建的对象有父对象时,QML 不会释放大量内存

将 qml 中的值动态绑定到转发器创建的对象

如何将动态创建的 qmlcomponent 对象绑定到另一个动态创建的 qmlcomponent 对象的属性?

在 QML 中获取对动态创建的 ChartView 的引用

如何为 QML 创建一个动态的全局主题?