当前位置: 首页 > news >正文

初始QML

由于项目原因,最近要进行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 引擎初始化流程

  1. 引擎实例化
    QQmlApplicationEngine engine; 创建 QML 引擎,负责解析 QML 文件、管理组件生命周期和绑定 JavaScript 上下文。

  2. QML 资源定位
    const QUrl url(QStringLiteral("qrc:/main.qml"))指定 QML 入口文件路径。qrc表示从 Qt 资源系统加载,避免文件路径依赖问题。

  3. 对象创建回调
    绑定引擎的信号,用于检测根组件是否成功加载。若失败(!obj 且 URL 匹配),则强制退出应用。

  4. 启动 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内容。

http://www.dtcms.com/a/384043.html

相关文章:

  • 贪心算法python
  • 淘宝客app的API网关设计:认证授权与流量控制策略
  • python快速使用mcp服务
  • 绑定方法与非绑定方法
  • 北科大2025研究生英语超星慕课第一单元标准答案
  • 人工智能方面的入门书籍有哪推荐?
  • STL之string类(C++)
  • 大模型原理的解析
  • Java 事务失效场景全解析
  • 简陋的进度条程序
  • SpringAOP中的通知类型
  • Python之文件读写 day9
  • 深度学习和神经网络之间有什么区别?
  • Linux驱动学习(SPI驱动)
  • 【MySQL|第七篇】DDL语句——数据库定义语言
  • 计算机毕设选题推荐:基于Java+SpringBoot物品租赁管理系统【源码+文档+调试】
  • Redis集群部署模式全解析:原理、优缺点与场景适配
  • ESP32的烧录和执行流程
  • ABP vNext + OpenXML / QuestPDF:复杂票据/发票模板与服务器端渲染
  • Java 注解入门:从认识 @Override 到写出第一个自定义注解
  • 网络层 -- IP协议
  • 社招面试BSP:BootROM知识一文通
  • Knockout.js DOM 操作模块详解
  • 面试题知识-NodeJS系列
  • 【层面一】C#语言基础和核心语法-02(反射/委托/事件)
  • Jmeter性能测试实战
  • CSP-S 2021 提高级 第一轮(初赛) 阅读程序(3)
  • TTC定时器中断——MPSOC实战3
  • [数据结构——lesson10.2堆排序以及TopK问题]
  • Maven 本地仓库的 settings.xml 文件