qml与C++混合编程--C++如何在ui界面中加载qml资源以及访问QML对象成员

C++ ui加载qml界面

可能是我查找的资料不够周全,没有找到在ui界面中嵌套qml界面的资料,经过一般探索,终于理解了如何嵌入qml界面。
首先我们需要理解下ui界面加载的原理,在这里我们建立了一个垂直布局 verticallayout,如下图
在这里插入图片描述然后建立一个qml文件,新建qrc资源,然后添加qml文件,如下所示
在这里插入图片描述

因为我建立的是layout布局,加载界面是需要用到QVBoxLayout的addWidget属性,所以新建了一个QQuickWidget对象

QQuickWidget *qw = new QQuickWidget(this);		//新建QQuickWidget布局
qw->setResizeMode(QQuickWidget::SizeRootObjectToView);		//设置大小,跟随布局大小
qw->setFocus();
qw->setSource(QUrl::fromLocalFile("://qosm.qml"));		//加载QML资源
ui->verticalLayout->addWidget(qw);		//加载布局

这样就成功加载qml布局了,官方教程对于新手不太友好,是用QQuickView加载,最后使用show()来显示qml布局,无法根据自己的想法嵌入ui某布局中,而且QQuickView老是弹出两个界面,也不能加载,可能是我没有正确使用吧。
在这里插入图片描述在这里插入图片描述这里我是点击按键加载地图,qml里写的是地图程序,大家可以随便写其他的测试即可。

注意:一定要小心加载setSource(QUrl::fromLocalFile("://qosm.qml")); 路径一旦不到是加载失败,我按照官方的路径加载老是失败,://qosm.qml 这样成功率比较高

C++读取qml对象

按照C++与QML交互的官方教程

// MyItem.qml
import QtQuick 2.0

Item {
    function myQmlFunction(msg: string) : string {
        console.log("Got message:", msg)
        return "some return value"
    }
}
// main.cpp
QQmlEngine engine;
QQmlComponent component(&engine, "MyItem.qml");
QObject *object = component.create();

QString returnedValue;
QString msg = "Hello from C++";
QMetaObject::invokeMethod(object, "myQmlFunction",
        Q_RETURN_ARG(QString, returnedValue),
        Q_ARG(QString, msg));

qDebug() << "QML function returned:" << returnedValue;
delete object;

以上是官方教程的代码,但是我是用ui加载的qml,怎么操作我也是试了两天,不过我们需要理解下C++是如何建立的qml引擎的
首先我们需要获取QQmlEngine 对象,而QQuickWidget可以返回QQmlEngine对象和QUrl对象
在这里插入图片描述

//获取object对象
QQmlComponent component(qw->engine(),qw->source());
    object = component.create();

通过点击按键读取函数返回值
在这里插入图片描述

总结

知识需要灵活变通的,一开始按照官方教程确实会让人迷糊,但需要我们多查询官方文档,理解背后的机理,这样我们才能根据自己的需求写自己需要的代码

猜你喜欢

转载自blog.csdn.net/github_39582118/article/details/108736281