2011-07-21 50 views
2

我正在創建一個應用程序,我想從C++源代碼中的QML調用一個函數,並且該C++函數返回可以使用它的對象和對象在QML的JavaScript部分中具有相同的屬性。我已經建立了連接和一切。我試圖發送一個QVariantMap並嘗試在javascript中使用該對象,但我沒有獲得該對象的屬性獲取QML中的C++對象並在javascript中使用它

+0

所以在這個階段你的QML識別C++對象,是否正確?您是否爲要訪問的元素創建了讀寫功能? – kmdent

+0

我有類似的東西,這個C++方法返回一個qvariant地圖 'QVariantMap Mediator :: initialize() { vector 表; 調解員m; 節點TestNode(「1」,table); QVariant test = QVariant :: fromValue(TestNode); QVariantMap地圖; 012.map.insert(「1」,proba); 返回地圖; }' 後來在JavaScript源我有: '函數foo(anObject) { 的console.log(anObject.getId()); }' 所以我想從那個對象中調用一個方法。到目前爲止,如果我嘗試訪問地圖,它只打印「QVariant(節點)」 對不格式化的文本 – nikolakoco

+0

確定該對象是否正確返回?我個人還沒有看到任何函數返回對象實例的樣本(我可能是錯的)。 另外我相信任何暴露給qml的對象都需要從QDeclarativeItem繼承並用qml註冊... 最後,如果一切正常並且你得到了正確的實例,我希望通過id屬性獲得對象的id:anObject.id(而不是底層的getter函數) – George

回答

0

要將對象從C++作爲函數返回值傳遞給QML,返回值類型需要是QVariant,而不是QVariantMap,即使這是C++代碼中的類型。因此,只要改變你的initialize函數簽名

QVariant initialize(); 

在不改變任何東西,然後你就可以訪問屬性。

關於你以後想要調用返回對象的方法的評論,這是不可能的;返回的對象只是一組名稱 - 值對。如果您希望該對象具有id屬性,則在返回該對象之前,需要使用該關鍵字insert的值與C++中的QVariantMap

3

有兩種方式從C++基於出口QObject的類型QML:

  1. 返回獨立的QObject直接財產Reader或Q_INVOKABLE功能。請注意,作爲屬性返回的對象具有C++所有權,Q_INVOKABLE-object具有JS所有權。您可以通過http://doc.qt.nokia.com/4.7/qdeclarativeengine.html#setObjectOwnership更改此默認行爲。
  2. 返回QObject的數組。在這種情況下,您應該使用QObjectList,QDeclarativePropertyMap(而不是QVariantMap)或QAbstractListModel。
相關問題