簡體   English   中英

Q_INVOKABLE 方法返回自定義 C++ 類型

[英]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 版本中的一個錯誤。

清單:確認您已完成以下操作:

當從Q_INVOKABLE方法返回指針時,請考慮對象所有權

我認為 Dimitri 的答案僅適用於您的類型是可復制的(因此它不適用於 QObject)。 我的理解是,當您有一個由 Qt 操作的類型時,例如,如果它由可調用對象返回,則該類型必須注冊為元類型

  • 不可復制的類型(如任何 QObject 派生模型)不能是元類型
  • 指針類型是不同的類型,因此它需要與其指向的類分開注冊
  • 對於指針類型Foo*您可以使用元類型系統注冊它: qRegisterMetaType<Foo*>("Foo*");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM