初探 QML 系列 -- 工程实践汇总(持续更新)
一、预备知识
Windows 支持两种类型的应用程序: GUI 程序和 CUI 程序。本文介绍的对象当然是 GUI 程序。Windows 应用程序必须有一个入口点函数,应用程序运行时,这个函数将被调用。C/C++ 开发人员可以使用以下两种入口点函数:
1 |
|
实际上,操作系统并不调用我们所写入口点函数。相反,它会调用由 C/C++ 运行库实现并在链接时使用 -entry: 命令行选项设置的一个 C/C++ 运行时启动函数。这些 启动函数的用途简单总结如下:
- 获取指向新进程的完整命令行的一个指针
- 获取指向新进程的环境变量的一个指针
- 初始化 C/C++ 运行库的全局变量
- 初始化 C 运行库内存分配函数( malloc 和 calloc )以及其他底层 I/O 例程使用的堆(heap)
- 调用所有全局和静态 C++ 类对象的构造函数
完成所有这些初始化工作之后,C/C++ 启动函数就会调用应用程序的入口点函数(后文简称 main
)。一个精心设计的应用程序框架,会在 main
入口点做一些有条理的工作:
- 解析命令行参数:判断运行目录,判断唤起方式,及其他业务
- 初始化环境:以共享内存的维护的单实例判断、日志系统初始化、多语言初始化、样式表初始化
- 初始化 UI:主窗口的初始化, 如:QMainWindow(qwidget), Window(qml)
- 开启事件循环:阻塞型 exec 的执行,但不阻塞 交互 和 UI 。exec 可被其他事件循环暂时挂起,比如:模态对话框,
QEventLoop
同步业务逻辑
由于涉及知识点较广泛,本文仅从某一侧面梳理 quick 工程应有的模样。
二、Qucik 工程调研
三、Coding 规范及要求
对于采用 MVVM 框架的 QWidget 工程,嵌入 Quick UI 需要尽量保持:模块独立、链路清晰。
1、协议命名规范
- QML:
- 事件请求:以 request 开头(requestXXX)
- 事件响应:以 Ack 结尾(XXXAck)
- Model:
- 事件处理:不作限制,保持以往习惯
- 双向转发:
- QML to C++: 以 sig 开头, Req 结尾(sigXXXReq)
- C++ to QML: 以 sig 开头, Ack 结尾(sigXXXAck)
- Thread:
- Slots: 以 on 开头,Req 结尾(onXXXReq)
2、QML 与 C++ 通信
3、QML 与 C++ 线程划分
- 模块接口描述
- QML CallBridge: QML 与 C++ 通信的媒介,属于 QWidget UI 线程
- requestXXX:用于 QML 内部发起请求,接口实际上只是触发一个事件(emit sigXXXReq)
- XXXAck: 用于 QML 内部接收对应的事件,接口实际上用于响应 requestXXX, 可通过参数携带数据
- XXX Model: 常规 MVVM 框架中的 Model 层,属于 QWidget UI 线程
- XXX: 业务接口,用于 Http 请求服务端数据和状态
- sigXXXReq: 用于中转事件请求,UI 线程 —-> 非 UI 线程
- sigXXXAck: 用于中转事件响应,非 UI 线程 —-> UI 线程
- XXX Manager: 本质上属于 MVVM 框架中的 Model, 属于非 UI 线程。其主要用于数据相关业务的处理
- onXXXReq: 用于调用业务接口 XXX, 保证该接口、数据处理、回调等均在非 UI 线程处理
- QML CallBridge: QML 与 C++ 通信的媒介,属于 QWidget UI 线程
- 交互流程
初探 QML 系列 -- 工程实践汇总(持续更新)
https://jalencui.com/2023/04/05/QML-Quick-framework/