如何将属性动态添加到QML元素?

如何将属性动态添加到QML元素?,qml,Qml,我想向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; */ } } 是否有任何方法可以完成上述任务。

我想向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;
  */
 }

}

是否有任何方法可以完成上述任务。

我不认为QML是为支持动态属性创建而设计的

根据您的用例,这可以通过“脚本实例”(术语是我编的)来解决。基本上,导入没有
.pragma library
语句的脚本的每个QML组件实例化将使用脚本中声明的globals的自己副本

例如,您可以查看PageStack(qt组件)

有一个
import“PageStack.js”as Engine
语句,它后来引用了使用全局变量的调用函数,就像它是实例变量一样


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

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

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

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

您可以这样做:

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;
   }
}

一方面:我不明白为什么会有人想这么做,因为这完全是非声明性的。然而,由于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”。

这根本不是问题的答案。。。将组件设置为不可见,无法向组件添加属性。。。在上面关于定义属性的有用链接中,通过defineProperty创建rect.newProp=xxx后,分配rect.newProp=xxx是否应该起作用?否,该功能未在QML中完全实现。如果要更改该值,始终需要通过
defineProperty
功能进行设置。要明确这一点:此属性不等同于QML属性。我认为这是部分原因,因为
描述符
没有被完全评估。似乎忽略了
可枚举
可写
设置器
获取器
。因此,我通常在我的对象中添加一个小函数
setDynProp(prop,value)
,在我实际需要它的极少数情况下。上述函数可能如下所示:
Object.defineProperty(rootWindow,'setDynProp',{value:function(prop,value){Object.defineProperty(rootWindow,prop,{value:value}})
---rootWindow是我添加此函数的对象。因此,要调用它,您将使用
rootWindow.setDynProp('newProp',42)
。如果更改常规JS对象(如:
属性var myObj:({})
),您还可以使用描述符中定义的setter和getter。