[英]Q_INVOKABLE method returning custom C++ type
我有一個 Q_INVOKABLE 的 C++ 方法。 我可以從 QML 調用這個方法,它在返回基本類型(如 QString)時工作。 但我不能使用自定義類型。 我該怎么做? 我應該返回一個 QVariant 嗎? 理想情況下,如果可能,我想返回一個指向我的自定義類型的指針。
編輯我做:
qmlRegisterType<MyType>("Mine", 1, 0, "MyType");
qmlEngine->rootContext()->setContextProperty("testObj", new MyType());
我可以使用 testObj 全局對象或創建 MyType QML 組件。 但是我不能在某些 javascript 代碼中使用它作為 Q_INVOKABLE C++ 方法的返回類型。
這是可能的,但您需要將自定義類型定義為interface 。
首先在你的main()函數中:
qmlRegisterInterface<MyType>("MyType");
現在您可以繼續創建一個對象並在Q_INVOKABLE
返回一個指針:
MyType* example = new MyType(parent);
return example;
注意:將父對象傳遞給自定義 QObject 以確保此對象與其父對象一起刪除(以避免內存泄漏)可能會有所幫助。
是的, QVariant
是您在該構造中自定義類的方法。 確保您注冊了您的課程。
話雖如此,您可能希望考慮使用 Q_PROPERTY 來代替您的自定義類型,然后即使沒有函數調用也可以訪問它。 如果您需要方法的自定義參數並且您無法重新排列代碼,這顯然不是一個選項。
請注意,此答案的目標是有類似問題的人,而不是最初的提問者。
所描述的方法應該有效,至少在 Qt 的最新版本中(我使用的是 Qt 5.12,但它也應該適用於舊版本)。 也許這是第一個 QML 版本中的一個錯誤。
清單:確認您已完成以下操作:
qmlRegisterType<MyType>("Mine", 1, 0, "MyType");
(或使用qmlRegisterUncreatableType )import Mine 1.0
Q_OBJECT
添加到您的類定義中。 當從Q_INVOKABLE
方法返回指針時,請考慮對象所有權。
我認為 Dimitri 的答案僅適用於您的類型是可復制的(因此它不適用於 QObject)。 我的理解是,當您有一個由 Qt 操作的類型時,例如,如果它由可調用對象返回,則該類型必須注冊為元類型:
Foo*
您可以使用元類型系統注冊它: qRegisterMetaType<Foo*>("Foo*");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.