在QML

时间:2015-06-17 12:16:06

标签: qt qml

如果你看一下this page,它会注意到当对象发生变化时,对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;不会自动触发更新。

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

修改:要明确,我不想替换整个car对象,而我想要使用{{1} (我的实际属性是一个javascript对象,无法存储在任何本机QML属性类型中)。

编辑2 :以下是使用无法工作的property var的示例(它说“汽车有0个车轮。”:

QtObject

3 个答案:

答案 0 :(得分:2)

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

  

如果onCompleted处理程序改为“car = new Object({wheels:6})”   然后文本将更新为“汽车有6个车轮”,因为   汽车财产本身会发生变化,从而导致变化   发出通知。

虽然我认为这违背了您不要替换整个extension String { // Build pi function of prefixes private func build_pi(str: [Character]) -> [Int] { var n = count(str) var pi = Array(count: n + 1, repeatedValue: 0) var k = -1 pi[0] = -1 for (var i = 0; i < n; ++i) { while (k >= 0 && str[k] != str[i]) { k = pi[k] } pi[i + 1] = ++k } return pi } // Knuth-Morris Pratt algorithm func searchPattern(pattern: String) -> [Int] { // Convert to Character array to index in O(1) var patt = Array(pattern) var S = Array(self) var matches = [Int]() var n = count(self) var m = count(pattern) var k = 0 var pi = build_pi(patt) for var i = 0; i < n; ++i { while (k >= 0 && (k == m || patt[k] != S[i])) { k = pi[k] } if ++k == m { matches.append(i - m + 1) } } return matches } } 对象的要求。

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

car

修改

鉴于新示例,如果您需要使用包含基本类型的Javascript数组,则您列出的代码不会触发更新。但是,如果您能够使用包含QML类型的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 } } ,则可以使用以下解决方法:

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; } } } 并更改它的黑客方法都是可取的。

答案 1 :(得分:0)

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

对于var中的JS对象,只有当实际对象与另一个对象一起更改时才会触发通知,但是当对象在内部发生更改时,通知才会被触发。

然而,您可以通过在内部对象更改后手动发出carChanged()来强制绑定重新评估。

答案 2 :(得分:-1)

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

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