QObject::findChildren() для поиска объектов QML

У меня есть форма QML с QQuickApplicationWindow, мне нужно получить QQuickItem указатели на BaseKey элементы QtVirtualKeyboard (его реализация помещается в отдельный файл QML и загружается с загрузчиком макета при выполнении программы), но имеет динамический (во время выполнения) тип, такой как BaseKey_QMLTYPE_XX, где "XX" - изменяемое число.

я нашел QObject::findChildren() Функция http://doc.qt.io/qt-4.8/qobject.html, но я не могу найти число "XX" в typename.

Как я могу найти указатель QQuickItem на BaseKey из кода C++?

1 ответ

Решение

BaseKey_QMLTYPE_XX выглядит так, как если бы вы печатали объект (print(myObject)). Я думаю, что это исходит от QMetaObject::className(),

Если объект не имеет objectName установить, вы не сможете найти его с помощью findChild() (если у вас нет доступа к типу C++ и есть только один объект этого типа).

У меня есть хакерская вспомогательная функция тестирования, которая делает что-то похожее на то, что вы ищете:

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

Вы можете адаптировать это, чтобы перебрать дочерние объекты объекта, который вы передаете. Есть несколько изменений, чтобы заставить его работать, но общая идея есть.

Другие вопросы по тегам