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

时间:2017-05-22 08:19:05

标签: qml qt5 qtvirtualkeyboard

我有#!/bin/bash gnome-terminal -x sh -c 'python3 main00.py' 的QML表单。我需要在QtVirtualKeyboard的QQuickApplicationWindow个元素上获得QQuickItem个指针(它的实现放在单独的QML文件中,并在程序执行时加载布局的Loader),但它具有动态(运行时)类似这样的BaseKey_QMLTYPE_XX,其中" XX"是一个多变的数字。

我找到BaseKey函数http://doc.qt.io/qt-4.8/qobject.html#findChild,但我找不到数字" XX"在typename中。

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

1 个答案:

答案 0 :(得分:1)

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;
}

你可以调整它来迭代你传入的对象的子节点。除了它之外还有更多的变化才能使它工作,但总体思路就在那里。