gpt4 book ai didi

c++ - 枚举QQmlEngine中的所有对象

转载 作者:搜寻专家 更新时间:2023-10-31 02:10:04 25 4
gpt4 key购买 nike

我想枚举QQmlApplicationEngine 中存在的和新创建的所有对象(派生自QObject)。它的主要目标是为它们中的每一个执行以下代码行:

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”

如果你必须动态添加新组件你可以重复这个过程,或者找到必要的组件并重命名它

关于c++ - 枚举QQmlEngine中的所有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45822456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com