我想枚举QQmlApplicationEngine中现有的和新创建的所有对象(从QObject派生)。它的主要目标是为它们执行以下代码行:
void denominate(QObject * const object)
{
if (object->objectName().isEmpty()) {
object->setObjectName(object->metaObject()->className());
}
}在QML运行时需要区分一些对象。比方说,当从Component创建StackView项时,我想知道它们中的哪一个真正在顶部。
某些组件或C++类的创建被延迟。如果我得到一个根对象并枚举它们的children(),它就是解决方案的一半。还有QQmlApplicationEngine::objectCreated信号,但我不完全理解上下文、引擎和(根)对象之间的相互关系。
如何命名所有未命名的对象,它存在于QQmlEngine中
发布于 2017-08-23 01:28:25
您可以使用递归枚举将它们全部重命名,例如: QML file:
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“
如果必须动态添加新组件,可以重复此过程,或者找到所需组件并重命名它
https://stackoverflow.com/questions/45822456
复制相似问题