首页 文章

在QML中更新绑定到var属性

提问于
浏览
3

如果你看一下this page,它会注意到当对象发生变化时,对var属性的绑定不会自动更新:

Item {
    property var car: new Object({wheels: 4})

    Text {
        text: "The car has " + car.wheels + " wheels";
    }

    Component.onCompleted: {
        car.wheels = 6;
    }
}

这将说"The car has 4 wheels"因为 car.wheels = 6; 不会自动触发更新 .

页面没有说的是如何解决这个问题?如何手动触发更新(不替换整个 car 对象) .

Edit: 要清楚,我不想替换整个 car 对象,我确实想要使用 property var (我的实际属性是一个无法存储在任何本机QML属性类型中的javascript对象) .

Edit 2: 这是一个使用 QtObject 的例子不起作用(它说"The car has 0 wheels.":

import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2

ApplicationWindow {
    width: 640
    height: 480
    visible: true

    property var car: QtObject { property var wheels: [] }

    Item {

        Text {
            text: "The car has " + car.wheels.length + " wheels";
        }

        Component.onCompleted: {
            car.wheels.push("Rear-left");
            car.wheels.push("Rear-right");
            car.wheels.push("Front-left");
            car.wheels.push("Front-right");
        }
    }
}

3 回答

  • 2

    实际上,该页面确实说明了如何解决这个问题:

    如果onCompleted处理程序改为“car = new Object({wheels:6})”,则文本将更新为“汽车有6个车轮”,因为汽车属性本身会被更改,这会导致更改通知被发射 .

    虽然我认为这违背了你不要更换整个 car 对象的要求 .

    话虽如此,还有(至少)另一种选择 - 使用QtObject

    Item
    {
        property var car: QtObject { property int wheels: 4 }
    
        Text {
            text: "The car has " + car.wheels + " wheels";
        }
    
        Component.onCompleted: {
            car.wheels = 6;  // This will update the text
        }
    }
    

    编辑

    给定新示例,如果您需要使用包含基本类型的Javascript数组,则会触发更新的代码 . 但是,如果您能够使用包含QML类型的 list ,则可以使用以下解决方法:

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

    根据您的需要,这可能是苛刻的 . 创建 property bool update 并在更改阵列时更改它的黑客方法可能更好 .

  • -1

    通知和自动绑定重新评估仅支持QML属性,而不支持JS对象成员 .

    对于var中的JS对象,仅当实际对象随另一个对象更改时才会触发通知,但是当对象在内部更改时则不会触发通知 .

    但是,您可以通过在进行内部对象更改后手动发出 carChanged() 来强制绑定重新评估 .

  • 0

    我用这种方式解决了同样的问题:

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

相关问题