如何在我的qt快速项目中将main.cpp
中的值发送到Qml
文件
transform: Rotation {
id: needleRotation
origin.x: 5; origin.y: 65
angle: -120 + VALUE*2
}
我需要Cpp的值经常用于使用qt quick 2.0制作的速度计
答案 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(value
和value
来定义属性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
。