2012-07-19 93 views
3

我在运行时不断地获取我的应用程序的数据,但是一旦我读入数据并将其存储在地图中,我就会遇到一些麻烦。属性绑定没有更新

当我尝试在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!") 
} 

回答

8

这是C++元素作家的责任,以使结合发出headingSensorChanged()被更新。

This tutorial是一个很好的开始实施C++元素的地方。

你的情况,你需要做的是这样的:

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

请注意,我们不发出通知的变化,除非真的有改变。这可以防止不必要的JS评估,也可以消除绑定循环的可能性。

+0

啊!我是个傻瓜!非常感谢。我习惯于编写具有getter和setter(发出Changed信号)的元素,当我在写这个套接字更新信息的时候,我没有想到要放入发射信号。太感谢了! – user1475920 2012-07-19 22:12:24