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对象
// 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();
通过点击按键读取函数返回值
总结
知识需要灵活变通的,一开始按照官方教程确实会让人迷糊,但需要我们多查询官方文档,理解背后的机理,这样我们才能根据自己的需求写自己需要的代码