由于项目原因,最近要进行qml相关开发,我之前也没有搞过qml,因此开一个qml系列的专栏,记录自己关于qml的相关学习
新建第一个qml工程
按如下图所示方法新建一个最简单的qml工程:
编译运行
可以看到是一个标题为“hello word”没有任何内容的空白窗体。
代码解析
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endifQGuiApplication app(argc, argv);QQmlApplicationEngine engine;const QUrl url(QStringLiteral("qrc:/main.qml"));QObject::connect(&engine,&QQmlApplicationEngine::objectCreated,&app,[url](QObject *obj, const QUrl &objUrl) {if (!obj && url == objUrl)QCoreApplication::exit(-1);},Qt::QueuedConnection);engine.load(url);return app.exec();
}
可以看到与传统QWidget工程相比关键不同的是这一部分:
QQmlApplicationEngine engine;const QUrl url(QStringLiteral("qrc:/main.qml"));QObject::connect(&engine,&QQmlApplicationEngine::objectCreated,&app,[url](QObject *obj, const QUrl &objUrl) {if (!obj && url == objUrl)QCoreApplication::exit(-1);},Qt::QueuedConnection);engine.load(url);
如果是QWidget工程这里一般是声明一个窗体比如QWidget然后show()显示。这里有一个很关键的QQmlApplicationEngine类,QML中最关键的也是这个QQmlApplicationEngine。
QQmlApplicationEngine 的核心作用
这段代码是 Qt Quick 应用程序的入口核心,与传统QWidget w,w.show()有本质区别。QQmlApplicationEngine负责加载 QML 文件并构建完整的应用程序对象树。比如上面代码engine.load(url)。这是一个QML引擎。
QML 引擎初始化流程
引擎实例化
QQmlApplicationEngine engine;
创建 QML 引擎,负责解析 QML 文件、管理组件生命周期和绑定 JavaScript 上下文。QML 资源定位
const QUrl url(QStringLiteral("qrc:/main.qml"))指定 QML 入口文件路径。qrc表示从 Qt 资源系统加载,避免文件路径依赖问题。对象创建回调
绑定引擎的信号,用于检测根组件是否成功加载。若失败(!obj
且 URL 匹配),则强制退出应用。启动 QML 渲染
前面都是准备工作,最后关键一步engine.load(url)最终触发 QML 文件的解析和渲染,生成可视化界面。
main.qml
import QtQuick 2.15
import QtQuick.Window 2.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")
}
QtQuick 2.15
:导入基础 Qt Quick 模块,包含创建 UI 所需的核心类型QtQuick.Window 2.15
:提供窗口管理功能,包含 Window 类型
这里就有一个疑问为什么是2.15,别的行不行?
QtQuick 和 QtQuick.Window 的版本号(如2.15)与Qt框架的版本发布周期相关。每个Qt版本会包含对应的Qt Quick模块更新,版本号反映了模块的兼容性和功能集。所以版本号并非随意选择,而是与Qt发行版中稳定的模块版本一致。例如我使用的Qt版本是5.15.2。Qt 5.15.2中Qt Quick模块的API版本为2.15。
然后下面部分就是定义了一个宽为640px,高为480px并且初始可见,标题为Hello World的window对象。
这里明显就可以看出与传统QWidget开发代码的不同,QWidget 通过代码显式创建控件(命令式),而 QML 通过描述式语言定义界面(声明式),由引擎动态生成对象。并且QWidget 直接操作原生窗口对象,QML 引擎则维护独立的场景图(Scene Graph),通过渲染线程优化性能。
以上就是关于新建的第一个qml工程的代码解析,后续会进一步更新其他相关qml内容。