在现有C ++ QT项目中实例化QML对象

时间:2016-02-06 21:18:32

标签: c++ qt qml qqmlcomponent qquickwidget

我们有一个用C ++编写的现有QT项目,我们希望将mapViewer示例项目添加到现有UI中。我们无法弄清楚如何实例化mapViewer,并调用初始化/显示它的方法。在线帮助之后,我们提出了下面的函数,它返回一个我们可以添加到UI元素的QQuickWidget。我们不断收到创建的组件永远不会准备好的错误,因此该函数不起作用。

QQuickWidget *buildMap(QWidget *parent)
{
    QQmlEngine *engine = new QQmlEngine;
    QQmlComponent component(engine, "qrc://mapviewer.qml");

    QObject *object = component.create();
    QMetaObject::invokeMethod(object, "initializeMap");

    QQuickWidget *map = new QQuickWidget(engine, parent);
    return map;
}

我们使用mapViewer组件创建一个对象,然后忘记它,但我们在网上找到的示例流程与此类似。

1 个答案:

答案 0 :(得分:0)

尝试这样的事情:

QQuickWidget *buildMap(QWidget *parent) {
    QQuickWidget *map = new QQuickWidget(parent);
    map->setSource(QUrl("qrc://mapviewer.qml"));
    map->show();
    return map;
}

至于initializeMap方法,可以在mapviewer.qml onCompleted中调用它吗?如果你坚持用C ++调用它,你仍然可以通过map->rootObject()

来访问该对象

此外,在创建组件和对象时,无论是C ++还是QML,检查状态和输出错误字符串(如果有的话)总是一个好主意,你不要只是假设它会全部工作然后再想为什么它没有。