7

我想将属性动态添加到 QML 元素:

Item {
 id: dynamicProperty;
 property int first;


 Component.onCompleted: {
  /* once this block of code is executed, i want to add
     property int second; property bool third; property variant fourth;
  */
 }

}

有什么办法可以完成上述任务。

4

4 回答 4

10

一方面:我不明白为什么有人要这样做,因为它完全是非声明性的。然而,由于 QML 扩展了 JavaScript,而后者是一种原型语言,是的,你可以做到。

关于操作方法,我建议阅读关于如何定义属性的 JS 文档。但是我写了一个简短的例子来演示它的使用。

MouseArea {
    anchors.fill: parent
    onClicked: console.log(rect.newProp)
}

Rectangle {
    id: rect
    width: 50
    height: 50
    x: 50
    y: 50
    color: 'green'

    MouseArea {
        anchors.fill: parent
        onClicked: { var obj = Object.defineProperty(rect, 'newProp',
                                                     {
                                                         enumerable: false,
                                                         configurable: false,
                                                         writable: false,
                                                         value: '50'
                                                     })}
    }
}

第一次单击背景时,将打印“未定义”。单击矩形后,它将变为“50”。

于 2016-10-19T07:35:44.330 回答
5

我不认为 QML 旨在支持动态属性创建。

根据您的用例,这可以使用“脚本实例”(我编造了这个术语)来解决。基本上,每个没有.pragma library声明的导入脚本的 QML 组件实例化都将使用它自己在脚本中声明的全局变量的副本。

例如,您可以查看 PageStack (qt-components)代码

import "PageStack.js" as Engine声明,它后来提到使用全局变量的调用函数,就像它是实例变量一样。

如果您正在寻找一种将成员添加到 QML 组件的方法并且不需要属性更改通知,那么“脚本实例”就可以了。

于 2012-09-24T18:26:11.027 回答
1

也许你可以这样做:

Item {
    id: dynamicProperty;
    property int first;
    property var extraData;

    Component.onCompleted: {
        /* once this block of code is executed, i want to add
           property int second; property bool third; property variant fourth;
        */
        var data;
        data["second"] = 0;
        data["third"] = false;
        ...
        extraData = data;
   }
}
于 2015-11-05T02:54:19.227 回答
-3

我不确定是否可以向 qml 对象添加动态属性,购买一种最简单的形式是禁用、隐藏或更改属性,例如:

if(manual==true)
{
    icon.visible=true
}
else {
    icon.visible=false
}

或者您可以创建项目的动态组件或使用 loader 元素更改视图。

于 2014-04-21T17:46:17.610 回答