我正在創建一個應用程序,我想從C++源代碼中的QML調用一個函數,並且該C++函數返回可以使用它的對象和對象在QML的JavaScript部分中具有相同的屬性。我已經建立了連接和一切。我試圖發送一個QVariantMap並嘗試在javascript中使用該對象,但我沒有獲得該對象的屬性獲取QML中的C++對象並在javascript中使用它
2
A
回答
0
要將對象從C++作爲函數返回值傳遞給QML,返回值類型需要是QVariant
,而不是QVariantMap
,即使這是C++代碼中的類型。因此,只要改變你的initialize
函數簽名
QVariant initialize();
在不改變任何東西,然後你就可以訪問屬性。
關於你以後想要調用返回對象的方法的評論,這是不可能的;返回的對象只是一組名稱 - 值對。如果您希望該對象具有id
屬性,則在返回該對象之前,需要使用該關鍵字insert
的值與C++中的QVariantMap
。
1
您要暴露的類必須從QObject繼承(或者如果它們是UI組件,則爲QDeclarativeItem),並且您必須在加載QML代碼之前在main()或Qt插件中註冊它們的類型。
看一看http://developer.qt.nokia.com/doc/qt-4.7/declarative-tutorials-extending-chapter1-basics.html
3
有兩種方式從C++基於出口QObject的類型QML:
- 返回獨立的QObject直接財產Reader或Q_INVOKABLE功能。請注意,作爲屬性返回的對象具有C++所有權,Q_INVOKABLE-object具有JS所有權。您可以通過http://doc.qt.nokia.com/4.7/qdeclarativeengine.html#setObjectOwnership更改此默認行爲。
- 返回QObject的數組。在這種情況下,您應該使用QObjectList,QDeclarativePropertyMap(而不是QVariantMap)或QAbstractListModel。
相關問題
- 1. 如何在C++中創建對象並在QML中訪問它
- 2. 如何從javascript中的Qml中通過objectName獲取對象?
- 3. 使用JavaScript獲取價值並在控制器中使用它
- 4. 從href中獲取參數並在javascript中使用它們
- 5. 在JavaScript中獲取對象的屬性
- 6. Qt在C++中創建對象並暴露給QML
- 7. 如何獲取對象的類型,並把它作爲在C#中的參數
- 8. 設置使用C QML對象++
- 9. 在C中使用JavaScript對象#
- 10. C++創建一個對象,並在同一行中使用它
- 11. 在C#中獲取對象的類型
- 12. 如何從AngularJS獲取變量並在javascript中使用它們?
- 13. 在Python中返回一個角色中的對象,並獲得QML中另一個對象的引用
- 14. 獲取網頁並使用javascript讀取它通過使用javascript
- 15. 使用Chrome在Javascript中獲取對象的真實位置
- 16. 如何在javascript中獲取對象值
- 17. 在Javascript中獲取網頁'對象'
- 18. 在JavaScript對象中獲取子數據
- 19. C#獲取通用對象的對象
- 20. 在Flex中使用ID獲取對象?
- 21. 公開一個C++對象到QML並聽取更改事件
- 22. 獲取函數的對象中的JavaScript
- 23. 在JavaScript中合併對象
- 24. 在C++中獲取對象ID
- 25. 在PHP中獲取Objective-C對象
- 26. 如何在QML中訪問C++類對象而不是在QML中創建單獨的對象?
- 27. 使用Javascript獲取網頁的網址,並在鏈接中使用它
- 28. 在Javascript中使用對象
- 29. 在JavaScript中獲取'this'對象而不使用'this'這個詞
- 30. 從JavaScript中的JSON對象獲取值
所以在這個階段你的QML識別C++對象,是否正確?您是否爲要訪問的元素創建了讀寫功能? – kmdent
我有類似的東西,這個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
確定該對象是否正確返回?我個人還沒有看到任何函數返回對象實例的樣本(我可能是錯的)。 另外我相信任何暴露給qml的對象都需要從QDeclarativeItem繼承並用qml註冊... 最後,如果一切正常並且你得到了正確的實例,我希望通過id屬性獲得對象的id:anObject.id(而不是底層的getter函數) – George