【问题标题】:To access QML component in C++ backend在 C++ 后端访问 QML 组件
【发布时间】:2016-03-29 12:22:11
【问题描述】:

我有一个带有Rectangle 的qml 文件。我想从 C++ 后端触发onClicked( )。 那么,如何在 C++/Qt 后端访问 QML 组件引用?

【问题讨论】:

    标签: qt qml qt5 qqmlcomponent qqmlapplicationengine


    【解决方案1】:

    您应该使用QObject::findChild() 来定位对象,并像调用名义方法一样简单地调用信号。

    但是有一个问题,因为QQuickRectangle 本身是一个私有类,所以它不能直接在 C++ API 中使用。此外,它实际上没有clicked() 信号,除非您自己实现了一个。如果你这样做了,它就不会成为 C++ 接口的一部分。

    另外,没有onClicked()信号,信号是clicked()onClicked:是handler hook。

    但是,您仍然可以使用 Qt 元系统发出它,只需使用:

    QObject * object = engine.rootObjects().at(0)->findChild<QObject *>("yourObjectName");
    if (object) QMetaObject::invokeMethod(object, "clicked");
    

    即使信号是在 QML 端实现的,它也可以工作,即使没有转换为具体的 C++ 类型也可以工作。

    现在,如果您的对象不直接位于根对象树中,您将无法找到它,并且别无选择,只能将对它的引用从 QML 端传递给 C++ 插槽或可调用函数。

    【讨论】:

    • 我尝试从invokeMethod调用QML onPropertyNameChanged()的槽,但它没有处理,我认为只能调用信号。
    • @Ashif - 没有这样的对象 onSignalName - 这只是为建立声明性连接提供的帮助,它不能被调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 2012-03-19
    • 2018-05-17
    • 1970-01-01
    相关资源
    最近更新 更多