Я хочу перечислить все объекты (полученные из QObject
) существующие и недавно созданные в QQmlApplicationEngine
, Основная цель — выполнить следующие строки кода для каждой из них:
void denominate(QObject * const object)
{
if (object->objectName().isEmpty()) {
object->setObjectName(object->metaObject()->className());
}
}
Необходимо различать некоторые объекты во время выполнения QML. Скажи когда StackView
элементы созданы из Component
и я хочу знать, кто из них действительно на вершине.
Создание некоторых компонентов или классов C ++ откладывается. И если я получу корневые объекты и перечислю children()
из них это половина решения. Также есть QQmlApplicationEngine::objectCreated
сигнал, но я не совсем понимаю взаимосвязь между контекстами, движком и (корневыми) объектами.
Как назвать все безымянные объекты, которые живут в QQmlEngine
?
Вы можете переименовать их все, используя рекурсивное перечисление
Например:
Файл 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»
Если вам нужно добавить новый компонент динамически, вы можете повторить эту процедуру или найти необходимый компонент и переименовать его.
Других решений пока нет …