枚举QQmlEngine

时间:2017-08-22 16:07:22

标签: c++ qml qt5 qtquick2 metaclass

我想枚举QObject中存在和新创建的所有对象(派生自QQmlApplicationEngine)。它的主要目标是为每个代码执行以下代码行:

void denominate(QObject * const object)
{
    if (object->objectName().isEmpty()) {
        object->setObjectName(object->metaObject()->className());
    }
}

需要在QML运行时中区分一些对象。比如说,StackView项是从Component创建的,我想知道哪些项目确实在最顶层。

某些组件或C ++类的创建被延迟。如果我得到一个根对象并枚举它们children(),它就是解决方案的一半。还有QQmlApplicationEngine::objectCreated信号,但我不完全理解上下文,引擎和(根)对象之间的相互关系。

如何命名所有未命名的对象,这些对象属于QQmlEngine

1 个答案:

答案 0 :(得分:2)

您可以使用递归枚举重命名所有这些内容 例如: QML文件:

import QtQuick 2.6
import QtQuick.Window 2.2

Window {
   visible: true
   width: 640
   height: 480
   title: qsTr("Hello World")

MouseArea
{
    id: r1
    width: 200
    height: 200
}

Rectangle
{
    id: r2
    color: "green"
    width: 100
    height: 100
    Item
    {
        id: r3
        width: 50
        height: 50
    }
}
}

您可以使用下一个机制在c ++部分设置其名称:

 void changeNames(QList<QObject*> ch)
 {
    for( QObject* ob: ch)
    {
        if (ob->objectName().isEmpty())
        {
            ob->setObjectName(ob->metaObject()->className());
        }
        changeNames( ob->children() );
    }
}

void enumerate(QList<QObject*> ch)
{
    for( QObject* ob: ch)
    {
        qInfo() << ob->objectName();
        enumerate( ob->children() );
    }
}

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    QObject *rootObject = engine.rootObjects().first();

    changeNames(rootObject->children());
    enumerate(rootObject->children());

    return app.exec();
}

您将在输出中看到下一个名字:
&#34; QQuickRectangle&#34;
&#34; QQuickMouseArea&#34;
&#34; QQuickItem&#34;

如果必须动态添加新组件,可以重复此过程,或找到必要的组件并重命名