2016-08-16 41 views
5

jestem rejestracji wiele typów jak QmlComponents poprzezdowiedzieć się, czy QObject jest zarejestrowanym Rodzaj QML

qmlRegisterType<Service>("my.services", 1, 0, "Service"); 

Teraz chciałbym przechodzić drzewo obiektów, podczas gdy coraz rodzajów QML zarejestrowanych TYLKO.

void Service::traverse(QString &path, QObject *root) { 
    if(<!root is registered qml type>) { //<-- this piece im missing 
     return; 
    } 

    if(!path.isEmpty()) { 
     path.append('.'); 
    }; 

    path.append(root->metaObject()->className()); 
    qDebug() << path; 

    foreach(QObject *o, root->children()) { 
     traverse(path, o); 
    } 
} 

Czy ktoś może mi pomóc z tym?

Odpowiedz

1

Najbliższy rzeczą mogę myśleć (bez zmieniania samych typów) byłoby użyć qmlEngine():

if (qmlEngine(root)) { 
    return; 
} 

jednak, że powróci prawdziwe dla każdego typu utworzonej w QML.

Aby wykryć tylko swoje typy C++, można podać swoją nazwę wpisać prefiks (np QmlService):

if (QString(root->metaObject()->className()).contains("Qml")) { 
    return; 
} 

choć jeśli można to zrobić, nie jestem pewien, dlaczego nie po prostu zachować śledzenie, które typy rejestrujesz na liście lub czymś, i odsyłaj do nich później. Jeśli rozwiniesz trochę o tym, co próbujesz osiągnąć, być może uda nam się wymyślić lepsze rozwiązania.