0

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

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

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

4

1 回答 1

1

BaseKey_QMLTYPE_XX看起来就像您打印对象 ( print(myObject)) 所得到的一样。我认为这来自QMetaObject::className().

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

我有一个hacky 测试辅助函数,它的功能类似于您所追求的:

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

您可以对其进行调整以迭代您传入的对象的子项。要使其正常工作,还有更多的更改,但总体思路就在那里。

于 2017-05-22T09:47:00.407 回答