QObject::findChildren() 用于 QML 对象查找

QObject::findChildren() for QML object finding

我有一个带有 QQuickApplicationWindow 的 QML 表单。我需要在 QtVirtualKeyboard 的 BaseKey 元素上获取 QQuickItem 指针(它的实现放置在单独的 QML 文件中,并在程序执行时加载布局加载器),但它具有像这样的动态(运行时)类型 BaseKey_QMLTYPE_XX,其中 "XX" 是一个可变的数字。

我找到了 QObject::findChildren() 函数 http://doc.qt.io/qt-4.8/qobject.html#findChild,但我找不到类型名称中的数字 "XX"。

如何从 C++ 代码中找到 BaseKey 上的 QQuickItem 指针?

BaseKey_QMLTYPE_XX 看起来像打印对象 (print(myObject)) 时得到的结果。我认为来自 QMetaObject::className().

如果对象没有 objectName 集,您将无法使用 findChild() 找到它(除非您可以访问 C++ 类型并且只有一个对象那种类型)。

我有一个 hacky test helper function 可以做一些类似于您想要的事情:

QObject *TestHelper::findPopupFromTypeName(const QString &typeName) const
{
    QObject *popup = nullptr;
    foreach (QQuickItem *child, overlay->childItems()) {
        if (QString::fromLatin1(child->metaObject()->className()) == "QQuickPopupItem") {
            if (QString::fromLatin1(child->parent()->metaObject()->className()).contains(typeName)) {
                popup = child->parent();
                break;
            }
        }
    }
    return popup;
}

您可以对其进行调整以迭代您传入的对象的子对象。要使其正常工作,还需要进行一些更改,但总体思路是这样的。