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