Перечислить все объекты в QQmlEngine

Я хочу перечислить все объекты (полученные из QObject) существующие и недавно созданные в QQmlApplicationEngine, Основная цель — выполнить следующие строки кода для каждой из них:

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

Необходимо различать некоторые объекты во время выполнения QML. Скажи когда StackView элементы созданы из Componentи я хочу знать, кто из них действительно на вершине.

Создание некоторых компонентов или классов C ++ откладывается. И если я получу корневые объекты и перечислю children() из них это половина решения. Также есть QQmlApplicationEngine::objectCreated сигнал, но я не совсем понимаю взаимосвязь между контекстами, движком и (корневыми) объектами.

Как назвать все безымянные объекты, которые живут в QQmlEngine?

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

Вы увидите следующие имена в выводе:
«QQuickRectangle»
«QQuickMouseArea»
«QQuickItem»

Если вам нужно добавить новый компонент динамически, вы можете повторить эту процедуру или найти необходимый компонент и переименовать его.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]