【问题标题】:Property binding not updating属性绑定未更新
【发布时间】:2012-07-18 23:37:39
【问题描述】:

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

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

我使用属性绑定访问 QML 中的值(我的印象是,每当 carData.headingSensor 更改时,这些都会导致 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!")
}

【问题讨论】:

    标签: qt binding qml qtquick2 qtcpsocket


    【解决方案1】:

    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 信号),以至于当我在套接字更新信息的地方编写这个时,我没想过要放入发射信号。谢谢一百万!
    猜你喜欢
    • 2011-12-18
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多