如何获取指定objectName的QObject

来源:互联网 发布:手机在线网页源码 编辑:程序博客网 时间:2024/06/16 06:51

如何获取指定objectName的QObject

作者 qyvlik

如下QML代码,设置了一个 objectNameYOUR_OBJECT_NAMEQML 对象,现在需要在 c++ 代码中获取到他。

//~ main.qmlimport QtQuick 2.0import QtQuick.Controls 2.0ApplicationWindow {    visible: true    QtObject {        objectName: "YOUR_OBJECT_NAME"    }}

如下 c++ 代码,试图通过 findChild 函数来获取 objectNameYOUR_OBJECT_NAMEQML 对象,但是却返回空。

QQmlApplicationEngine engine;engine.load("main.qml");QList<QObject*> rootObjects = engine.rootObjects();QObject* root = Q_NULLPTR;foreach (QObject* iter, rootObjects) {    if (iter->objectName() == "root") {        root = iter;        break;    }}QObject* YOUR_OBJECT_NAME = root->findChild<QObject*>("YOUR_OBJECT_NAME", Qt::FindDirectChildrenOnly);qDebug() << "YOUR_OBJECT_NAME:" << YOUR_OBJECT_NAME;

在仔细阅读代码,以及测试,发现,上诉代码 root->findChild 只能获取到父类为 Item 的对象;父类为 QtObject 的对象,其父亲为 Window::contentItem 或者 ApplicationWindow::contentItem。这里给出通过 objectName 获取 QML 对象的代码:

QObject *findClindByObjectNameFromQmlEngine(QQmlApplicationEngine *qmlEngine, QString objectName){    if (qmlEngine == Q_NULLPTR) {        return Q_NULLPTR;    }    QList<QObject*> rootObjects = qmlEngine->rootObjects();    QObject* child = Q_NULLPTR;    foreach (QObject* iter, rootObjects) {        if (iter->inherits("QQuickItem")) {            child = iter->findChild<QObject*>(objectName);            break;        }        child = iter->findChild<QObject*>(objectName);        if (child != Q_NULLPTR) {            break;        }        QObject* contentItem = iter->property("contentItem").value<QObject*>();        if (contentItem != Q_NULLPTR) {            child = contentItem->findChild<QObject*>(objectName);            break;        }    }    return child;}