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;
}
Вы можете адаптировать это, чтобы перебрать дочерние объекты объекта, который вы передаете. Есть несколько изменений, чтобы заставить его работать, но общая идея есть.