Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 更新QML中var属性的绑定_Qt_Qml - Fatal编程技术网

Qt 更新QML中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

如果您查看一下,请注意,对象更改时,对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=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 like
car=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;
    }
}