我有一个由几个QWidgets组成的项目,每个QWidgets都有自己的qml文件。每个qml文件都使用一些变量导入相同的Global.js文件(例如var xyz = 1)。现在,我想通过我的c ++代码更改这个javascript变量。
Global.js:
.pragma library
var xyz = 300;
my.qml:
import "Global.js" as Global
Rectangle {
property int m_heigth
width: Global.xyz
heigth: m_heigth
}
C ++:
this->setProperty("m_heigth", 300); // <--- does work
this->setProperty("Global.xyz", 300); // <--- does not work :(
如何在C ++中访问此javascript变量?
答案 0 :(得分:0)
您可以在C++
中构建对象,使用QObject
为Q_PROPERTY
中要访问的每个元素继承QML
。
然后,您使用QML
将此对象显示为QQmlContext::setContextProperty()
。
例如,假设Globals
是C++
对象的类型,您的main()
方法可能如下所示:
int main(int argc, char *argv[]) {
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.rootContext() -> setContextProperty("globals", new Globals);
engine.load(QUrl(QLatin1String("qrc:/qml/main.qml")));
return app.exec();
}
现在从main.qml
开始,您可以访问以下任何属性:
Text {
text: qsTr("Test")
color: globals.myFavouriteColour
}
答案 1 :(得分:0)
我建议通过让C ++对象将各自的变量作为属性,通过setContextProperty()
公开它,然后在Global.js
在C ++中使用全局状态通常是一个好主意,因为它甚至可以在重新加载QML内容后继续存在,这对于快速开发非常有用,等等。
C ++对象只需要从QObject
派生,并使用Qt s
Q_PROPERTY`机制,大致类似于此
class MyGlobal : public QObject
{
Q_OBJECT
Q_PROPERTY(int xyz MEMBER m_xyz NOTIFY xyzChanged)
signals:
void xyzChanged();
private:
int m_xyz;
};
Expsoing对象看起来像这样
// assuming a QQmlEngine named engine, e.g. from a QQuickView or a QQmlApplicationEngine
MyGlobal global;
engine->rootContext()->setContextProperty("_global", &global);
然后可以在QML中访问该对象,就好像它是一个标识为_global
的QML元素,例如var xyz = _global.xyz
或width: _global.xyz