初探 QML 系列 -- 工程实践汇总(持续更新)

一、预备知识

Windows 支持两种类型的应用程序: GUI 程序和 CUI 程序。本文介绍的对象当然是 GUI 程序。Windows 应用程序必须有一个入口点函数,应用程序运行时,这个函数将被调用。C/C++ 开发人员可以使用以下两种入口点函数:

1
2
3
4
5
6
7
8
9
10
Int WINAPI _tWinMain(
HINSTANCE hInstanceExe,
HINSTANCE,
PTSTR pszCmdLine,
int nCmdShow);

int _tmain(
int argc,
TCHAR *argv[],
TCHAR *envp[]);

实际上,操作系统并不调用我们所写入口点函数。相反,它会调用由 C/C++ 运行库实现并在链接时使用 -entry: 命令行选项设置的一个 C/C++ 运行时启动函数。这些 启动函数的用途简单总结如下:

  • 获取指向新进程的完整命令行的一个指针
  • 获取指向新进程的环境变量的一个指针
  • 初始化 C/C++ 运行库的全局变量
  • 初始化 C 运行库内存分配函数( malloccalloc )以及其他底层 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 系列 -- 工程实践汇总(持续更新)
https://jalencui.com/2023/04/05/QML-Quick-framework/
Author
Jalen Cui
Posted on
April 5, 2023
Licensed under