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

Posted

技术标签:

【中文标题】在现有 C++ QT 项目中实例化 QML 对象【英文标题】:Instantiating QML object in existing C++ QT Project 【发布时间】:2016-02-06 21:18:32 【问题描述】:

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

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】:

试试这样的:

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

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

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

【讨论】:

以上是关于在现有 C++ QT 项目中实例化 QML 对象的主要内容,如果未能解决你的问题,请参考以下文章

Qt Quick QML 实例之疯狂数字游戏(QML C++混合编程翻译QSetting )建议收藏

Qt Quick QML 实例之疯狂数字游戏(QML C++混合编程翻译QSetting )建议收藏

Qt Quick QML 实例之疯狂数字游戏(QML C++混合编程翻译QSetting )建议收藏

C++ 和 QML 中的 QT QML 项

Qt Qml,在 iOS 上将地图(OSM Mapbox Mapboxgl)嵌入到 QQuickWidget C++ 对象中

将 QML(QQuickView) 添加到现有 UI