我試圖揭露一個對象作爲全局屬性以Java腳本,其具有以下方法:Qt的5.0:將C++方法Java腳本
Q_INVOKABLE MyObject* createMyObject();
MyObject來從QObject的衍生。
當我把這種方法在Java腳本返回類型的對象:
QVariant(MyObject*)
我想知道,如果它可以自動將其轉換爲QJSValue這樣我就可以在腳本中進一步使用它呢?
我試圖揭露一個對象作爲全局屬性以Java腳本,其具有以下方法:Qt的5.0:將C++方法Java腳本
Q_INVOKABLE MyObject* createMyObject();
MyObject來從QObject的衍生。
當我把這種方法在Java腳本返回類型的對象:
QVariant(MyObject*)
我想知道,如果它可以自動將其轉換爲QJSValue這樣我就可以在腳本中進一步使用它呢?
在腳本中引用MyObject之前,需要完成的所有操作都是調用下面的方法。
qmlRegisterType<MyObject>("", 1, 0, "MyObject");
然後createMyObject方法將返回正確的類型,無需任何轉換:
var obj = createMyObject();
MyObject
其實如果我們改變以下
Q_INVOKABLE MyObject* createMyObject();
方法的類型
Q_INVOKABLE QObject* createMyObject();
就會開始工作,即使沒有
qmlRegisterType
您可以使用QJSEngine::newQObject()
方法。
使用newQObject()包裝一個QObject的(或亞類)的指針。 newQObject()返回一個代理腳本對象;屬性,孩子以及QObject的信號和插槽可用作代理對象的屬性。不需要綁定代碼,因爲它是使用Qt元對象系統動態完成的。
是的,我知道。但它需要在我的類的每個Q_INVOKABLE周圍封裝以將返回值轉換爲QJSValue。 – Maxym
似乎Java腳本使用QVariant作爲任何「未知」類型的不透明包裝。該值可以很容易地傳遞,但其屬性可以使用而非其方法可以被調用。要在腳本中使用,應將其轉換爲QJSValue。我發現的唯一辦法就是宣佈助手功能是這樣的:
Q_INVOKABLE QJSValue convert(QVariant var)
{
return _engine.newQObject(var.value<QObject*>());
}
然後有可能的QVariant轉換爲QJSValue:
var obj = convert(createMyObject());
和OBJ將類型
MyObject
所以現在它可以在腳本中使用。
很好的解決方案。會注意到:)。 –
經過一段時間後找到了更正確的解決方案(使用qmlRegisterType)。看到我最近的回答。 – Maxym
我在一個類似的情況,試圖用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 *))?
如果您使用沒有Qml的JS引擎,它將無法工作:)。 –
令人驚訝的是它!我不使用qml,它與qmlRegisterType一起使用,不與qRegisterMetaType一起使用。 – Maxym