弄清楚QObject是否是注册的QML类型

时间:2016-08-16 10:03:47

标签: qt qml

我通过

将许多类型注册为QmlComponents
qmlRegisterType<Service>("my.services", 1, 0, "Service");

现在我想在获取qml注册类型的同时遍历对象树。

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);
    }
}  

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

我能想到的最接近的事情(不改变类型本身)就是使用qmlEngine()

if (qmlEngine(root)) {
    return;
}

但是,对于在QML中创建的任何类型,它都将返回true。

要仅检测您的C ++类型,您可以为其类型名称指定前缀(例如QmlService):

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

虽然如果你能做到这一点,我不确定你为什么不跟踪你在列表或其他东西中注册的类型,并在以后引用它。如果你详细说明你想要实现的目标,也许我们可以提出更好的解决方案。