2014-06-25 33 views
5

我有一個C++方法,使Q_INVOKABLE。我可以從QML調用這個方法,它在返回基本類型(如QString)時起作用。但我不能使用自定義類型。我應該怎麼做?我應該返回一個QVariant嗎?理想情況下,如果可能的話,我想返回一個指向我的自定義類型的指針。Q_INVOKABLE方法返回自定義C++類型

編輯 我做的:

qmlRegisterType<MyType>("Mine", 1, 0, "MyType"); 
    qmlEngine->rootContext()->setContextProperty("testObj", new MyType()); 

我可以使用testObj全局對象或創建的MyType QML組件。但是我不能在一些JavaScript代碼中將它用作Q_INVOKABLE C++方法的返回類型。

回答

2

是的,QVariant是您在該建築中定製課程的途徑。確保你註冊你的課程。這就是說,你不妨考慮使用Q_PROPERTY代替你的自定義類型,然後即使沒有函數調用也可以訪問它。如果您需要方法的自定義參數,並且無法重新排列代碼,那顯然不是一種選擇。

+0

非常感謝。我會嘗試與QVariant然後。另外,感謝關​​於使用Q_PROPERTY的建議。在我的情況下,方法調用是檢索一個對象,所以一個屬性會非常有意義。謝謝! – Korchkidu

+0

根據文檔,應該可以將自定義C++類型從Q_INVOKABLE方法返回到QML。這是可能的還是它在文檔中的錯誤? – Korchkidu

+0

@Korchkidu:我認爲如果你正確地註冊了類型,這是可能的。 – lpapp

1

這是可能的,但您需要將自定義類型 定義爲接口。

首先在你的的main()功能:

qmlRegisterInterface<MyType>("MyType"); 

現在您可以繼續創建一個對象,並在Q_INVOKABLE返回一個指針 :

MyType* example = new MyType(parent); 
return example; 

注意:將父項傳遞給您的自定義QObject以確保此對象與其父項一起刪除(以避免內存泄漏)可能會有所幫助。

+0

如果提供了nullptr父項,則該對象在qml代碼中超出作用域時將被刪除,因此也沒有內存泄漏。如果提供了實際的父代,則該對象與其父代一起被刪除。不過,這隻基於我的實驗;在文檔中我沒有發現這種行爲的任何保證。 – pepan