2014-06-15 5 views
5

Qt nie pozwala na zarejestrowanie szablonu klasy?QMetaProperty :: read: Nie można obsłużyć niezarejestrowanego typu danych "TreeItem <InspectorItem> * '

Moja klasa hierarchia jest

TreeItemTemplateBackend : public QObject 

template<typename T> 
TreeItem : public TreeItemTemplateBackend 

To właśnie zarejestrowany w QML:

qmlRegisterType<InspectorItem>("ge.gui", 1, 0, "InspectorItem"); 
qmlRegisterType<TreeItemTemplateBackend>("ge.gui", 1, 0, "TreeItemTemplateBackend"); 
qmlRegisterType<TreeItem<InspectorItem>>("ge.gui", 1, 0, "TreeItem"); 

ja wciąż coraz to błąd:

QMetaProperty :: czytać: Nie do obsługi niezarejestrowanego typu danych TreeItem<InspectorItem>* dla obiektu "Inspektor :: root"

Inspektor :: korzeń jest:

Q_PROPERTY(TreeItem<InspectorItem> * root READ root NOTIFY rootChanged) 
+0

Spróbuj zarejestrować typ wskaźnika zamiast typu klasy? – Chris

+1

@Chris: dostałem inne błędy: wpisz "TreeItem *" nie może być użyty przed "::", ponieważ nie ma członków – Krab

+0

@Chris: nadal nie wiem, czy możliwe jest nawet zarejestrowanie szablonu klasy – Krab

Odpowiedz

11

gdy chcesz użyć wskaźnika na przykład „ClassA” w Q_PROPERTY, trzeba zarejestrować go tak:

qRegisterMetaType<ClassA*>("ClassA*"); 

Rozwiązaniem może być bardziej skomplikowane dla ciebie z powodu użycia szablonów, ale mam nadzieję, że to wskazuje się w dobrym kierunku.

(tak samo jak mój other answersource: 'jpn'.)

+0

Kiedy to zrobię, otrzymuję wyjątek w QScopedPointer.h – ancajic

0

trzeba zrobić dwie rzeczy:

  1. Zarejestruj swój typ z makro Q_DECLARE_METATYPE(ClassName*) dla każdej realizacji szablonu. Zapamiętaj na końcu gwiazdkę (*) na końcu:! Ponieważ musisz odsłonić wskaźnik, a nie wartość. Na przykład Q_DECLARE_METATYPE(ClassName<ItemClass>*). Zajrzyj do dokumentacji, gdzie najlepiej jest umieścić tę deklarację (zwykle po deklaracji klasowej ze wszystkich przestrzeni nazw). Występują również problemy z przestrzeniami nazw, więc zawsze używaj tutaj pełnych kwalifikowanych nazw.
  2. Zarejestruj każdą realizację szablonu za pomocą qmlRegisterType<ClassName>(...) lub qmlRegisterUncreatableType<ClassName>(...), jeśli potrzebujesz po prostu ujawnić niektóre dane z właściwością, a nie utworzyć ich w QML. Tutaj nie potrzebujesz gwiazdki, ponieważ nie rejestrujesz wskaźnika, ale samą klasę.