如何使用C ++ API获取QML对象的id属性

时间:2019-02-27 14:31:16

标签: c++ qt qml

我需要解析一个QML树,并从中获取所有QML对象的id。我注意到id的行为不像普通属性(请参见下面的示例)–从obj->property调用返回的值是无效的QVariant

我的问题是–有没有办法以某种怪异(但可复制)的方式检索对象的id

简化示例:

main.qml:

import QtQuick 2.9
import QtQuick.Window 2.2

Window {
    visible: true

    Item {
        id: howToGetThis
        objectName: "item"
    }
}

main.cpp:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QTimer>
#include <QDebug>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    QTimer::singleShot(1000, [&]() {
        auto item = engine.rootObjects()[0]->findChild<QObject*>("item");
        qDebug() << item->property("objectName");
        qDebug() << item->property("id");
    });

    return app.exec();
}

输出:

QVariant(QString, "item")
QVariant(Invalid)

1 个答案:

答案 0 :(得分:2)

我认为您需要的是

QString QQmlContext::nameForObject(QObject *object)

您可以在此处找到说明: https://doc.qt.io/qt-5/qqmlcontext.html#nameForObject

  

在此上下文中返回对象的名称,如果在上下文中未命名对象,则返回一个空字符串。在QML创建的上下文中,对象由setContextProperty()命名,或者由IDs 命名。