属性绑定不更新

use*_*920 3 binding qt qml qtcpsocket qtquick2

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

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

我使用属性绑定访问QML中的值(我的印象是这些导致headingSensor每次carData.headingSensor更改时都会更新?):

property int headingSensor: carData.headingSensor
Text {  text: "Heading: " + headingSensor }
Run Code Online (Sandbox Code Playgroud)

在我的数据类中,我有:

Q_PROPERTY(int headingSensor READ getHeadingSensor NOTIFY headingSensorChanged)
        int headingSensor;
Run Code Online (Sandbox Code Playgroud)

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

    int data::getHeadingSensor(){
        return data.value(heading)[headingSensorReading];
    }
Run Code Online (Sandbox Code Playgroud)

它返回正在使用传入信息更新的地图中的值.

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

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

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

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

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

Connections {
    target: carData
    onSensorHeadingChanged: updateValues
}
Run Code Online (Sandbox Code Playgroud)

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


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

Mar*_*inJ 8

C++元素编写器负责发出headingSensorChanged()以便更新绑定.

本教程是实现C++元素的好地方.

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

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

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