C ++和QML之间的交换值

时间:2014-11-19 22:53:41

标签: c++ qt qml

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

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

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

3 个答案:

答案 0 :(得分:7)

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

按照我提供的链接显示,您可以按如下方式重写您的课程:

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
};

这里我们使用相应的getter和setter(valuevalue来定义属性setValue。)setter方法发出通知信号,这是通知QML时的基础值改变了。

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

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

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

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

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

答案 1 :(得分:4)

Q_PROPERTY就是答案。

对于一般信息属性: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

我读了第二篇,但仍然有效,但重新审视新文档是有道理的。

答案 2 :(得分:2)

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

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

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