我在运行时不断获取应用程序的数据,但是一旦我读完数据并将其存储在地图中,我就会遇到一些问题。
当我尝试在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!")
}
答案 0 :(得分:8)
C ++元素编写者有责任发出headingSensorChanged()
以便更新绑定。
This tutorial是一个很好的起点。
在你的情况下,你需要做这样的事情:
void data::updateVariables(){
int sensorReading = data.value(heading)[headingSensorReading];
if (headingSensor != sensorReading) {
headingSensor = sensorReading;
emit headingSensorChanged();
}
}
请注意,除非确实存在更改,否则我们不会发出更改通知程序。这可以防止不必要的JS评估,也可以消除绑定循环的可能性。