2016-09-28 48 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