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

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

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

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


person Nikxp    schedule 22.05.2017    source источник
comment
QObject::findChildren() выполняет поиск по objectName, если это был ваш вопрос.   -  person folibis    schedule 22.05.2017
comment
@folibis, вы правы, но как я могу узнать имя объекта, если у него есть индексный номер части зависимости во время выполнения?   -  person Nikxp    schedule 22.05.2017
comment
Вы пытаетесь протестировать приложение, использующее виртуальную клавиатуру, или?   -  person Mitch    schedule 22.05.2017
comment
@Mitch Я пытался получить координаты кнопки и вызвать событие нажатия клавиши   -  person Nikxp    schedule 22.05.2017


Ответы (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;
}

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

person Mitch    schedule 22.05.2017