在C++和 QML 之间交换值

Exchange values between C++ and QML

本文关键字:交换 之间 QML C++      更新时间:2023-10-16

如何将值从main.cpp发送到qt快速项目中Qml文件

transform: Rotation {
            id: needleRotation
            origin.x: 5; origin.y: 65
            angle: -120 + VALUE*2
       }

我经常需要 Cpp 的值来制作使用 qt quick 2.0 制作的速度表

我猜该属性是由某个对象生成的。在这种情况下,您可以利用Q_PROPERTY(请参阅此处)。

按照我提供的链接中显示的内容,您可以按如下方式重写您的类:

class DataProvider : public QObject
{
    Q_OBJECT
    Q_PROPERTY(qreal value READ value WRITE setValue NOTIFY valueChanged)
public:
    void setValue(qreal newVal) {    // <--- do your stuff to update the value
        if (newVal != m_value) {
            m_value = newVal;
            emit valueChanged();     // <--- emit signal to notify QML!
        }
    }
    qreal value() const {
        return m_value;             
    }
signals:
    void valueChanged();             // <--- actual signal used as notification in Q_PROPERTY
private:
    qreal m_value;                   // <--- member value which stores the actual value
};

在这里,我们定义了一个属性value,具有相应的 getter 和 setter(valuesetValue resp.)setter 方法发出通知信号,这是在值更改时通知 QML 的基础。

现在,要将对象公开给QML(以及它的属性),只需将其注册为context property;只需在main中编写:

 DataProvider data;
 engine.rootContext()->setContextProperty("data", &data);  // ALWAYS before setting the QML file...

现在,可以通过 QML 中的名称data来使用DataProvider实例data。只需像这样重写您的 QML:

transform: Rotation {
            id: needleRotation
            origin.x: 5; origin.y: 65
            angle: -120 + data.value * 2
       }

每次在 C++ 代码中调用 setValue() 并且值发生更改时,都会发出通知并重新评估绑定。

Q_PROPERTY就是

答案。

对于属性的一般 inf:http://qt-project.org/doc/qt-4.8/qml-extending.html。

在本文中查找Q_PROPERTY:http://qt-project.org/doc/qt-5/properties.html。

第二篇文章是C++/QML开发的必备文章(阅读整篇文章)。以及更新和结构化的信息:http://qt-project.org/doc/qt-5/qml-extending-tutorial-index.html

我阅读了第二个,这仍然有效,但重新访问新文档是有意义的。

如果要直接从函数向 QML 公开单个值main()请使用 QQmlContext::setContextProperty 。在呼叫之前放置engine.load(...)

engine.rootContext()->setContextProperty("VALUE", 10.0);

注意:您可能希望采用某种命名约定来区分上下文属性与局部变量和属性。例如,我以下划线开始所有上下文属性名称,如下所示:_value