2013-02-25 65 views
2

我有一套C++類在Qt 5中基於QJSEngine(因爲Qt腳本似乎已被棄用)暴露給javascript。自定義C++類型到QJSEngine:成員函數返回值始終是QVariant

我的QObject派生類A和B具有Q_OBJECT宏並且也使用Q_DECLARE_METATYPE宏。

我已經公開了我的類的工廠函數,允許我從JavaScript內部創建新的實例。以下所有作品罰款:

a = namespace.createNewA(); // QJSEngine reports a type A object 
b = namespace.createNewB(); // QJSEngine reports a type B object 
b.SetParent(a); // SetParent is a slot of B taking a const A& parameter, gets called correctly 
// But now. 
b.GetParent(); // Reports QVariant(A), even though this is a slot: A GetParent() const 

有沒有辦法,我保證,而不是說的QVariant中的getParent的JavaScript被確認爲實際類型的對象,?

回答

2

我想通了,這些問題與我的原代碼:

  1. 使用Qt插槽返回值可能不是在一般情況下是一個好主意(見例如Qt: meaning of slot return value?)。我將函數改爲Q_INVOKABLE,但實際上並沒有改變結果,但它似乎是一個更安全的地方。
  2. 按值返回對於腳本/包裝也不是一個好主意。用調試器挖掘代碼我發現QVariant轉換爲qobject失敗,並且使燈泡熄滅:by-value可能會破壞嘗試查找QObject派生類型的qobject_cast。我改變了調用返回一個指向QObject的指針,現在QJSEngine將該對象報告爲正確的類型。

這需要對我的代碼設置進行一些更改,因爲返回值曾經是臨時的,但我可以忍受。

+0

你有沒有機會分享如何用QJSEngine創建「新」對象?我現在正在努力。我發現的所有文檔都是用舊引擎進行描述的 – Jay 2015-02-23 19:08:03

相關問題