属性绑定没有更新
问题描述:
我在运行时不断地获取我的应用程序的数据,但是一旦我读入数据并将其存储在地图中,我就会遇到一些麻烦。属性绑定没有更新
当我尝试在QML中显示数据时,它只是显示零,尽管我可以在应用程序输出中看到它的更新。
我使用属性绑定(?我的印象是,这些导致headingSensor
进行更新时carData.headingSensor
改变下)在QML访问值:
property int headingSensor: carData.headingSensor
Text { text: "Heading: " + headingSensor }
在我的数据I类有:
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!")
}
答
这是C++元素作家的责任,以使结合发出headingSensorChanged()
被更新。
This tutorial是一个很好的开始实施C++元素的地方。
你的情况,你需要做的是这样的:
void data::updateVariables(){
int sensorReading = data.value(heading)[headingSensorReading];
if (headingSensor != sensorReading) {
headingSensor = sensorReading;
emit headingSensorChanged();
}
}
请注意,我们不发出通知的变化,除非真的有改变。这可以防止不必要的JS评估,也可以消除绑定循环的可能性。
啊!我是个傻瓜!非常感谢。我习惯于编写具有getter和setter(发出Changed信号)的元素,当我在写这个套接字更新信息的时候,我没有想到要放入发射信号。太感谢了! – user1475920 2012-07-19 22:12:24