2014-06-25 6 views
5

Mam wykonaną metodę C++ Q_INVOKABLE. Mogę nazwać tę metodę z QML i działa, gdy zwraca podstawowe typy (jak QString). Ale nie mogę z niestandardowym typem. Jak mam to zrobić? Czy powinienem zamiast tego zwrócić QVariant? Najlepiej byłoby, jeśli to możliwe, zwrócić wskaźnik do mojego typu niestandardowego.Metoda Q_INVOKABLE zwracająca niestandardowy typ C++

EDIT zrobić:

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

mogę używać testObj globalnego obiektu lub utworzyć komponent MyType QML. Ale nie mogę go używać w niektórych kodach javascript jako typ zwracany z Q_INVOKABLE C++.

Odpowiedz

2

Tak, QVariant jest sposobem na uzyskanie niestandardowej klasy w tej konstrukcji. Upewnij się, że zarejestrujesz swoją klasę.

Mimo to warto rozważyć użycie Q_PROPERTY zamiast niestandardowego typu, a następnie można uzyskać do niego dostęp bez wywoływania funkcji. Jeśli potrzebujesz niestandardowych parametrów do metody i nie możesz zmienić kolejności kodu, nie jest to oczywiście opcja.

+0

wielkie dzięki. Spróbuję wtedy z QVariant. Ponadto dziękuję za sugestię dotyczącą używania Q_PROPERTY zamiast. W moim przypadku wywołanie metody polega na pobraniu obiektu, aby właściwość miała sens. Dzięki! – Korchkidu

+0

Zgodnie z dokumentacją powinno być możliwe zwrócenie niestandardowych typów C++ z metody Q_INVOKABLE do QML. Czy jest to możliwe, czy jest to błąd w dokumentacji? – Korchkidu

+0

@Korchkidu: Jest to możliwe, jeśli prawidłowo zarejestrujesz typ, tak myślę. – lpapp

1

Jest to możliwe, ale musisz zdefiniować niestandardowy typ jako interfejs.

Przede wszystkim w main() funkcji:

qmlRegisterInterface<MyType>("MyType"); 

Teraz można przystąpić do tworzenia obiektu i zwraca wskaźnik w Q_INVOKABLE:

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

Uwaga: może być korzystne przekazanie rodzica do niestandardowego obiektu QObject w celu zapewnienia, że ​​obiekt ten zostanie usunięty wraz z jego obiektem nadrzędnym (aby uniknąć wycieków pamięci).

+0

Jeśli podano obiekt macierzysty nullptr, obiekt jest usuwany, gdy wykracza poza zakres w kodzie qml, więc nie ma również wycieku pamięci. Jeśli dostarczono rzeczywistego rodzica, obiekt jest usuwany wraz z rodzica. Opiera się to jednak tylko na moich eksperymentach; Nie znalazłem żadnej gwarancji tego zachowania w dokumentacji. – pepan