我想枚举QObject
中存在和新创建的所有对象(派生自QQmlApplicationEngine
)。它的主要目标是为每个代码执行以下代码行:
void denominate(QObject * const object)
{
if (object->objectName().isEmpty()) {
object->setObjectName(object->metaObject()->className());
}
}
需要在QML运行时中区分一些对象。比如说,StackView
项是从Component
创建的,我想知道哪些项目确实在最顶层。
某些组件或C ++类的创建被延迟。如果我得到一个根对象并枚举它们children()
,它就是解决方案的一半。还有QQmlApplicationEngine::objectCreated
信号,但我不完全理解上下文,引擎和(根)对象之间的相互关系。
如何命名所有未命名的对象,这些对象属于QQmlEngine
?
答案 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;
如果必须动态添加新组件,可以重复此过程,或找到必要的组件并重命名