C++和QML之间的交换值

Awe*_*ed2 2 c++ qt qml

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

transform: Rotation {
            id: needleRotation
            origin.x: 5; origin.y: 65
            angle: -120 + VALUE*2
       }
Run Code Online (Sandbox Code Playgroud)

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

BaC*_*Zzo 7

我猜这个属性是由某个对象产生的.在这种情况下,你可以利用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
};
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

transform: Rotation {
            id: needleRotation
            origin.x: 5; origin.y: 65
            angle: -120 + data.value * 2
       }
Run Code Online (Sandbox Code Playgroud)

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