我想枚举所有存在和新创建的对象(派生自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">
如果必须动态添加新组件,可以重复此过程,或找到必要的组件并重命名