4

我在应用程序运行时不断获取数据,但是一旦我读入数据并将其存储在地图中,我在显示数据时遇到了一些麻烦。

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

1 回答 1

8

It is the responsibility of the C++ element writer to emit headingSensorChanged() in order to cause the binding to be updated.

This tutorial is a good place to start when implementing a C++ element.

In your case you need to do something like this:

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

Note that we don't emit the change notifier unless there really is a change. This prevents needless JS evaluations, and also removes the possibility of binding loops.

于 2012-07-19T21:52:50.027 回答