2016-09-28 50 views
0

我有一个项目由几个QWidgets组成,每个QWidgets都有自己的qml文件。每个qml文件导入与某些变量相同的Global.js文件(例如var xyz = 1)。现在,我想通过我的C++代码来改变这个javascript变量。如何从qpp通过qml访问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变量?

+1

一个简单的解决方案是使用JS setter和getter函数,只要它们是QML对象的成员函数,就可以从C++调用JS函数。 – dtech

+0

这是可能的,而无需更改qml文件?我不想更改所有qml文件,其中也包含其他包含Global.js的qml文件。 – redstack

回答

0

您可以在C++中构建对象,继承QObject,使用Q_PROPERTY表示您想从QML访问的每个元素。

然后使用QQmlContext::setContextProperty()使该对象可见到QML

例如,假设GlobalsC++对象的类型,你main()方法可能是这个样子:

现在从main.qml中,你可以通过以下方式访问任何财产:

Text { 
    text: qsTr("Test") 
    color: globals.myFavouriteColour 
} 
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访问该对象,就好像在QML元素的ID为_global(例如, var xyz = _global.xyzwidth: _global.xyz

+0

听起来不错。你可以给我一些代码片段,以更好地了解如何做到这一点? – redstack