2013-01-18 22 views
6

我試圖揭露一個對象作爲全局屬性以Java腳本,其具有以下方法:Qt的5.0:將C++方法Java腳本

Q_INVOKABLE MyObject* createMyObject(); 

MyObject來從QObject的衍生。

當我把這種方法在Java腳本返回類型的對象:

QVariant(MyObject*) 

我想知道,如果它可以自動將其轉換爲QJSValue這樣我就可以在腳本中進一步使用它呢?

回答

3

在腳本中引用MyObject之前,需要完成的所有操作都是調用下面的方法。

qmlRegisterType<MyObject>("", 1, 0, "MyObject"); 

然後createMyObject方法將返回正確的類型,無需任何轉換:

var obj = createMyObject(); 

MyObject 

其實如果我們改變以下

Q_INVOKABLE MyObject* createMyObject(); 

方法的類型

Q_INVOKABLE QObject* createMyObject(); 

就會開始工作,即使沒有

qmlRegisterType 
+0

如果您使用沒有Qml的JS引擎,它將無法工作:)。 –

+0

令人驚訝的是它!我不使用qml,它與qmlRegisterType一起使用,不與qRegisterMetaType一起使用。 – Maxym

2

您可以使用QJSEngine::newQObject()方法。

使用newQObject()包裝一個QObject的(或亞類)的指針。 newQObject()返回一個代理腳本對象;屬性,孩子以及QObject的信號和插槽可用作代理對象的屬性。不需要綁定代碼,因爲它是使用Qt元對象系統動態完成的。

請詳細閱讀QJSEngine Class: QObject Integration

+0

是的,我知道。但它需要在我的類的每個Q_INVOKABLE周圍封裝以將返回值轉換爲QJSValue。 – Maxym

4

似乎Java腳本使用QVariant作爲任何「未知」類型的不透明包裝。該值可以很容易地傳遞,但其屬性可以使用而非其方法可以被調用。要在腳本中使用,應將其轉換爲QJSValue。我發現的唯一辦法就是宣佈助手功能是這樣的:

Q_INVOKABLE QJSValue convert(QVariant var) 
{ 
    return _engine.newQObject(var.value<QObject*>()); 
} 

然後有可能的QVariant轉換爲QJSValue:

var obj = convert(createMyObject()); 

和OBJ將類型

MyObject 

所以現在它可以在腳本中使用。

+0

很好的解決方案。會注意到:)。 –

+0

經過一段時間後找到了更正確的解決方案(使用qmlRegisterType)。看到我最近的回答。 – Maxym

0

我在一個類似的情況,試圖用QJSEngine的腳本(在停留在試圖揭露一個的QList到QJSEngine的那一刻...)

我認爲將現有C++對象公開到腳本的最簡單方法是這樣的:

//create c++ file object 
MyObject* anObject = new MyObject(); 

//make c++ object available to script 
QJSValue scriptObject = myEngine.newQObject(anObject); 
myEngine.globalObject().setProperty("obj", scriptObject); 

您現在應該能夠從腳本訪問「obj」。

順便說一句,如何找出腳本中的類型(QVariant(MyObject *))?