【问题标题】:QObject::findChildren() for QML object findingQObject::findChildren() 用于 QML 对象查找
【发布时间】:2017-10-21 19:39:39
【问题描述】:

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

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

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

【问题讨论】:

  • QObject::findChildren() 搜索 objectName 如果这是您的问题。
  • @folibis,你是对的,但是如果它有运行时依赖部分-索引号,我怎样才能找到对象名称?
  • 您是在尝试测试使用虚拟键盘的应用程序,还是?
  • @Mitch 我尝试获取按钮坐标并发出按键事件

标签: qml qt5 qtvirtualkeyboard


【解决方案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;
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多