属性绑定不更新

时间:2012-07-19 18:03:40

标签: qt binding qml qtquick2 qtcpsocket

我在运行时不断获取应用程序的数据,但是一旦我读完数据并将其存储在地图中,我就会遇到一些问题。

当我尝试在QML中显示数据时,它只显示零,尽管我可以在应用程序输出中看到它更新。

我使用属性绑定访问QML中的值(我认为,只要headingSensor更改,这些导致carData.headingSensor会更新吗?):

property int headingSensor: carData.headingSensor
Text {  text: "Heading: " + headingSensor }

在我的数据课中,我有:

Q_PROPERTY(int headingSensor READ getHeadingSensor NOTIFY headingSensorChanged)
        int headingSensor;

在我最初的c ++实现中:

    int data::getHeadingSensor(){
        return data.value(heading)[headingSensorReading];
    }

返回使用传入信息更新的地图中的值。

我意识到这可能不起作用,因为该属性依赖于headingSensor变量,尽管返回了正确的值,但该变量本身并未更新。所以,我想如果我改变了它来更新headingSensor值并返回它可能会起作用。

所以在我的数据采集逻辑中,我写了一个方法来更新变量。

                data.insert(key, value);
                updateVariables();
            }
        }
    }
    void data::updateVariables(){
        headingSensor = data.value(heading)[headingSensorReading];
    }
    int data::getHeadingSensor(){
        return headingSensor;
    }

虽然除了地图中的值之外,这导致headingSensor变量被更新,但QML显示中仍然没有显示正确的值。它只显示0(最初显示时的默认值,因为它尚未从传入数据中获取值)。

所以,我想知道,如何将QML中显示的sensorHeading的值更新为它的值和/或地图中的值在C ++中更改?我是否需要做以下事情:

Connections {
    target: carData
    onSensorHeadingChanged: updateValues
}

编辑: 尝试这样的东西,onSensorHeadingChanged永远不会激发。我不知道为什么,因为我在应用程序输出中看到它时,sensorHeading的值明显改变


Connections{
     target: carData
     onHeadingSensorChanged: console.log("It's noting the change!")
}

1 个答案:

答案 0 :(得分:8)

C ++元素编写者有责任发出headingSensorChanged()以便更新绑定。

在实现C ++元素时,

This tutorial是一个很好的起点。

在你的情况下,你需要做这样的事情:

void data::updateVariables(){
    int sensorReading = data.value(heading)[headingSensorReading];
    if (headingSensor != sensorReading) {
        headingSensor = sensorReading;
        emit headingSensorChanged();
    }
}

请注意,除非确实存在更改,否则我们不会发出更改通知程序。这可以防止不必要的JS评估,也可以消除绑定循环的可能性。