文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JavaScript中创建动态QML对象的方法

2024-04-02 19:55

关注

一、动态创建对象

有两种方法可以从 JavaScript 动态创建对象:

虽然动态创建的对象可以与其他对象一样使用,但它们在 QML 中没有 id。

1.1、动态创建组件

可以调用它的 createObject() 方法来创建该组件的一个实例。这个函数可以接受两个参数:

第一个是新对象的父对象。父对象可以是图形对象(即 Item 类型)或非图形对象(即 QtObject 或 C++ QObject 类型)。只有带有图形父对象的图形对象才会被渲染到 Qt Quick 可视画布上。如果希望稍后设置父级,可以安全地将 null 传递给此函数。
第二个是可选的,是一个属性值对的映射,它定义了对象的初始任何属性值。此参数指定的属性值在对象创建完成之前应用于对象,避免在必须初始化特定属性以启用其他属性绑定时可能发生的绑定错误。此外,与在创建对象后定义属性值和绑定相比,性能优势很小。
示例。

Sprite.qml 它定义了一个简单的 QML 组件:


import QtQuick 2.0
 
Rectangle { width: 80; height: 50; color: "red" }


main.qml 导入了一个 componentCreation.js JavaScript 文件,该文件将创建 Sprite 对象:


import QtQuick 2.0
import "componentCreation.js" as MyScript
 
Rectangle 
{
    id: appWindow
    width: 300; height: 300
 
    Component.onCompleted: MyScript.createSpriteObjects();
}


componentCreation.js


var component;
var sprite;
 
function createSpriteObjects() 
{
    component = Qt.createComponent("Sprite.qml");
    if (component.status == Component.Ready)
        finishCreation();
    else
        component.statusChanged.connect(finishCreation);
}
 
function finishCreation() 
{
    if (component.status == Component.Ready) 
    {
        sprite = component.createObject(appWindow, {x: 100, y: 100});
        if (sprite == null) 
        {
            console.log("Error creating object");
        }
    } 
    else if (component.status == Component.Error) 
    {
        console.log("Error loading component:", component.errorString());
    }
}


当使用带有相对路径的文件时,路径应该是相对于执行 Qt.createComponent() 的文件。

也可以通过 incubateObject() 函数在不阻塞的情况下实例化组件。

1.2、从 QML 字符串创建对象

可以使用 Qt.createQmlObject() 函数从 QML 字符串创建 QML 对象,如下例所示:


const newObject = Qt.createQmlObject(`
    import QtQuick 2.0
    Rectangle 
    {
        color: "red"
        width: 20
        height: 20
    }
    `,
    parentItem,
    "myDynamicSnippet"
);


如果 QML 字符串使用相对路径导入文件,则路径应该相对于定义父对象(方法的第二个参数)的文件。

在构建静态 QML 应用程序时,会扫描 QML 文件以检测导入依赖项。这样,所有必要的插件和资源都会在编译时解决。但是,这仅考虑显式导入语句(位于 QML 文件顶部的语句),而不考虑包含在字符串文字中的导入语句。为了支持静态构建,用户需要确保使用 Qt.createQmlObject() 的 QML 文件在文件顶部明确包含所有(包括字符串文字内部)必要的导入。

二、动态删除对象

在许多用户界面中,将可视对象的不透明度设置为 0 或将可视对象移出屏幕而不是将其删除就足够了。 但是,如果有大量动态创建的对象,则删除未使用的对象可能会获得有价值的性能优势。

请注意:永远不应该手动删除由便利 QML 对象工厂(例如 Loader 和 Repeater)动态创建的对象。此外,应该避免删除不是自己动态创建的对象。

可以使用 destroy() 方法删除项目。 此方法有一个可选参数(默认为 0),用于指定销毁对象之前的近似延迟(以毫秒为单位)。

示例。application.qml 创建 SelfDestroyingRect.qml 组件的五个实例。 每个实例运行一个 NumberAnimation,当动画完成时,调用它的根对象上的 destroy() 来销毁自己:

application.qml   


import QtQuick 2.0
 
Item 
{
    id: container
    width: 500; height: 100
 
    Component.onCompleted: 
    {
        var component = Qt.createComponent("SelfDestroyingRect.qml");
        for (var i=0; i<5; i++) 
        {
            var object = component.createObject(container);
            object.x = (object.width + 10) * i;
        }
    }
}


SelfDestroyingRect.qml


import QtQuick 2.0
 
Rectangle 
{
    id: rect
    width: 80; height: 80
    color: "red"
 
    NumberAnimation on opacity 
    {
        to: 0
        duration: 1000
 
        onRunningChanged: 
        {
            if (!running) 
            {
                console.log("Destroying...")
                rect.destroy();
            }
        }
    }
}
 

或者,application.qml 可以通过调用 object.destroy() 销毁创建的对象。

请注意:对该对象内的对象调用 destroy() 是安全的。 对象不会在调用 destroy() 的瞬间被销毁,而是在该脚本块结束和下一帧之间的某个时间被清除(除非指定了非零延迟)。

另请注意,如果 SelfDestroyingRect 实例是像这样静态创建的:


Item 
{
    SelfDestroyingRect 
    {
        // ...
    }
}


这会导致错误,因为对象只有在动态创建时才能动态销毁。

使用 Qt.createQmlObject() 创建的对象可以类似地使用 destroy() 销毁:


const newObject = Qt.createQmlObject(`
    import QtQuick 2.0
    Rectangle 
    {
        color: "red"
        width: 20
        height: 20
    }
    `,
    parentItem,
    "myDynamicSnippet"
);
newObject.destroy(1000);

到此这篇关于 JavaScript中 创建动态 QML 对象的方法的文章就介绍到这了,更多相关 JavaScript 创建动态 QML 对象内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯