Qt 更新QML中var属性的绑定
如果您查看一下,请注意,对象更改时,对var属性的绑定不会自动更新:Qt 更新QML中var属性的绑定,qt,qml,Qt,Qml,如果您查看一下,请注意,对象更改时,对var属性的绑定不会自动更新: Item { property var car: new Object({wheels: 4}) Text { text: "The car has " + car.wheels + " wheels"; } Component.onCompleted: { car.wheels = 6; } } 也就是说“汽车有4个轮子”,因为car.wheels
Item {
property var car: new Object({wheels: 4})
Text {
text: "The car has " + car.wheels + " wheels";
}
Component.onCompleted: {
car.wheels = 6;
}
}
也就是说“汽车有4个轮子”,因为car.wheels=6代码>不会自动触发更新
页面没有说明如何解决这个问题?如何手动触发更新(无需更换整个汽车
对象)
Edit:要清楚,我不想替换整个car
对象,我想使用属性var
(我的实际属性是一个javascript对象,不能存储在任何本机QML属性类型中)
编辑2:下面是一个使用QtObject
的示例,该示例不起作用(它说“汽车没有车轮”):
实际上,该页面确实说明了如何解决这一问题:
如果未完成的处理程序改为“car=new对象({wheels:6})”
然后文本将更新为“汽车有6个轮子”,因为
汽车属性本身会发生变化,这会导致变化
要发出的通知
尽管我认为这违背了您不更换整个汽车对象的要求
也就是说,还有(至少)一个选择——使用:
编辑
在新示例中,如果需要使用包含基本类型的Javascript数组,则列出的代码不会触发更新。但是,如果能够使用包含QML类型的列表
,则可以使用以下解决方法:
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2
ApplicationWindow {
id: window
width: 640
height: 480
visible: true
property var car: QtObject { property list<Item> wheels }
Component
{
id: wheelComponent
QtObject
{
property var wheelName;
}
}
Text
{
anchors.fill: parent
text: "The car has " + car.wheels.length + " wheels";
Component.onCompleted:
{
var wheel = wheelComponent.createObject(window, {"wheelName": "Rear-left"} );
car.wheels += wheel;
}
}
}
导入QtQuick 2.4
导入QtQuick.Controls 1.3
导入QtQuick.Window 2.2
导入QtQuick.Dialogs 1.2
应用程序窗口{
id:窗口
宽度:640
身高:480
可见:正确
属性var car:QtObject{property list wheels}
组成部分
{
id:车轮组件
QtObject
{
财产名称;
}
}
正文
{
锚定。填充:父级
文字:“该车有”+car.wheels.length+“wheels”;
Component.onCompleted:
{
var wheel=wheelComponent.createObject(窗口,{“wheelName”:“左后”});
car.wheels+=车轮;
}
}
}
这可能会对您的需求造成严重影响。创建属性bool更新
并在您更改阵列时对其进行更改的黑客方法可能更可取。我通过以下方式解决了相同的问题:
Item {
property var car: new Object({wheels: 4})
Text {
Connections {
target: car
onWheelsChanged: {
text: "The car has " + car.wheels + " wheels";
}
}
text: "The car has " + car.wheels + " wheels";
}
Component.onCompleted: {
car.wheels = 6;
}
}
通知和自动绑定重新评估仅支持QML属性,不支持JS对象成员
对于var中的JS对象,只有当实际对象与另一个对象发生更改时才会触发通知,但当对象内部发生更改时不会触发通知
但是,您可以通过手动发出carChanged()来强制绑定重新计算
在内部对象更改之后。是的,我不想替换整个汽车
对象。而使用QtObject
只是转移了问题-您现在使用的是属性int
而不是属性var
。我的实际对象是多维矩阵,因此我必须使用属性var
@timmm即使wheels
是property var
,它也可以工作。但是,我需要查看多维矩阵的示例,以了解QtObject
是否在这里工作。如果wheels
是非对象JS值(即双精度或字符串),它似乎可以工作,但如果它更复杂,例如数组
,则不会。我在我的问题中添加了一个数组示例。顺便说一句,为帮助干杯。@timmm我已通过答案进行了更新,尽管它可能无法满足您的需要。创建新对象很费力,但您可以通过简单地分配car=car
来触发更新通知,这应该是有希望的完全不创建新对象。在阅读后,我认为这是不可能的。但您可以做的一件事是在数据处理后仅重新分配数组而不是整个对象:car.wheels
=car.wheels
,在推送元素后。至少比替换整个对象更好。但这取决于数据的存储方式是的,或者我想添加一个虚拟属性,比如:property bool update
,然后在我的表达式中“使用”它,比如文本:“废话”+(update?”:“”)
。然后要手动更新,只需执行update=!update
或类似操作。不过需要进行大量的黑客攻击。仅供参考,将car
分配回自身也会在组件的末尾起作用。onCompleted
block likecar=car;
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2
ApplicationWindow {
id: window
width: 640
height: 480
visible: true
property var car: QtObject { property list<Item> wheels }
Component
{
id: wheelComponent
QtObject
{
property var wheelName;
}
}
Text
{
anchors.fill: parent
text: "The car has " + car.wheels.length + " wheels";
Component.onCompleted:
{
var wheel = wheelComponent.createObject(window, {"wheelName": "Rear-left"} );
car.wheels += wheel;
}
}
}
Item {
property var car: new Object({wheels: 4})
Text {
Connections {
target: car
onWheelsChanged: {
text: "The car has " + car.wheels + " wheels";
}
}
text: "The car has " + car.wheels + " wheels";
}
Component.onCompleted: {
car.wheels = 6;
}
}