本文转载自 OpenHarmony TSC 官方微信公众号《峰会回顾第29期 | Qt For OpenHarmony
》
演讲嘉宾 | 蔡万苍
回顾整理 | 廖 涛
排版校对 | 李萍萍
嘉宾简介
蔡万苍,13 年 C++/Qt 开发相关工作经验,曾任职 Qt 公司,担任技术支持、Qt 咨询师,协助国内多家 Qt 企业版用户完成基于 Qt 的软件框架搭建,参与 Qt 开源社区 Bug 维护及修改,在基于 Qt 框架的软件架构设计、Qt 跨平台适配上有多年的技术积累和经验,开源书籍 QmlBook-in-Chinese 在 github 上 star 数达到 1000+,现任职于软通动力信息技术(集团)股份有限公司,担任成都图形框架研究院软件开发专家角色,负责图形框架研究院的技术管理工作。
内容来源
第一届开放原子开源基金会 OpenHarmony 技术峰会——生态与互联分论坛
视频回顾
https://www.bilibili.com/video/BV1Hp4y1N7TC/?spm_id_from=333.337.search-card.all.click
正 文 内 容
在全球超过 70 个行业,8000 家公司,100 万的开发者都在使用 Qt,通过 Qt 适配 OpenHarmony,能够丰富 OpenHarmony 的开发生态、应用生态,加速 OpenHarmony 在各行业的推广使用。如何推进和完成 Qt 在 OpenHarmony 上的适配呢?软通动力成都图形框架研究院软件开发专家蔡万苍在第一届 OpenHarmony 技术峰会上分享了精彩观点。
01►Qt 适配 OpenHarmony 意义
Qt 是一个 C++跨平台开发框架,主要用于开发图形用户界面(Graphical User Interface,GUI)程序,具有跨平台类库(支持目前所有主流软硬件平台组合)、集成开发工具(缩短软件产品上市时间)以及跨平台集成开发环境(高生产力开发环境)等。全球超过 100 万研发者使用过 Qt,Qt 的跨平台开发能力覆盖 70 多个行业,是从 1994 年至今得到广泛的认同和验证的主流技术。
Qt 适配 OpenHarmony 有什么意义?
一、扩大 OpenHarmony 开发者阵营:基于 Qt 跨平台特性及 Qt For OpenHarmony 的适配,吸引数量庞大的 Qt 开发人员在 OpenHarmony 上进行跨平台应用迁移及应用开发,能够实现开发人员业务目标与个人能力和 OpenHarmony 开源生态与技术发展的双赢。
二、丰富 OpenHarmony 应用生态:Qt 支持目前主流的所有操作系统,如 UBuntu、CentOS、OpenEuler、Android、OS X、iOS、Windows、VxWorks、QNX 等,涵盖从嵌入式平台、移动平台及 PC 桌面,基于 Qt 框架典型的桌面应用,从娱乐到工业软件都有所涉及,如暴雪的战网客户端、WPS、VirtualBox 等等,大部分应用程序都可以使用 Qt 实现。通过 Qt 适配 OpenHarmony,能够加速 OpenHarmony 的行业应用推广。
02►计划贡献内容
2.1►►适配计划
Qt 按使用及部署划分,包含了设计工具、开发工具、框架必要模块、框架附加模块 4 个部分,基于 OpenHarmony 跨平台开发考虑,总体计划如下:
● 针对 OpenHarmony 的开发工具进行补充
● 对 Qt 必要模块进行适配支持
● 对部分 Qt 附加模块适配支持
具体工作如下:
● 成立 OH_QT sig,完成 Qt Core(Qt 核心模块)、Qt GUI(显示相关代码)以及 Qt QML 适配
● 完成 Qt 工程部署,适配 Qt 相关的开发工具,实现 Qt 应用程序北向开发封装;适配 Qt 附加库部分,如 Qt Multimedia,QtRemoteObjects
● 完成 Qt 示例及 DEMO 适配验证、Qt 单元测试适配验证;向 Qt 社区申请立项 OpenHarmony 支持,申请 OH_QT sig 毕业
● 开发 Qt 工程转换 DevEco 工程工具实现快速的应用迁移配置
2.2►►Qt 配套开发工具
Qt 开发者通常使用 Qt 配套的集成开发环境 Qt Creator,采用 qmake 或 cmake 进行软件工程管理配置,为方便开发者对已有软件进行移植适配,我们会开发对应的工程转换工具,将 Qt 的应用工程转换为 DevEco Application 工程,帮助开发者快速实现应用的迁移配置。
03►技术难点分享
Qt 本身是跨平台的框架,我们要把它跟 OpenHarmony 做移植,无非考虑几个问题:一是 Qt 应用程序的界面如何在 OpenHarmony 上进行显示;OpenHarmony 本身触屏的输入、鼠标/键盘的输入怎么能够把它映射到 Qt 本身的应用程序框架里去。需要了解 Qt 的 QPA 实现及系统接口调用的相关逻辑,就能实现 Qt 应用程序在 OpenHarmony 上的运行。
3.1►►QPA 实现及系统接口调用
Qt 平台抽象(QPA)是 Qt 的平台抽象层,QPA 插件是通过子类化各种 QPlatform*类来实现系统接口的接入,例如用于窗口系统集成的 QPlatformIntegration 和 QPlatformWindow 以及用于更深层次的平台主题化和集成的 QPlatformTheme。
QPA 核心对象及作用:通过 QPlatfromIntegration 实现对 QPA 插件的对象声明周期管理,Qt GUI 等模块通过 Qt 已完成的平台抽象层相关类实现对系统底层的调用,其中比较重要的实现类包括:EventDispatcher(实现系统底层事件接入)、BackingStore(系统图形绘制双缓存实现)、Screen(系统屏幕对象,用于管理 Window 显示)、Window(系统窗口对象)、InputContext(系统输入处理,包括鼠标、输入法等)、OpenGLContext(系统窗口 OpenGL 渲染上下文)以及 Clipboard(系统剪切板)。
Qt Widget For OpenHarmony 渲染流程:基于 Qt 框架自成体系的图形框架和事件系统,在 OpenHarmony 上基于 XComponent 生成的 EGLSurface,采用图像二维绘制的方式在 OpenGL Surface 上实现双缓存渲染机制,完成 Qt Widget 的窗口内容渲染。
Qt Quick For OpenHarmony 渲染流程:Qt Quick 采用自成体系的 Scene Graph 基于 OpenGL 标准接口实现,QPA OpenHarmony 插件基于 XCompent 生成 EGL Surface,并通过 QPA 标准实现类重载实现 PlatformIntegration 实现与 Scene Graph 的 OpenGLContext 绑定,Qt Quick 基于标准 OpenGL 接口在 XComponent 上实现图形渲染。
OpenHarmony Touch 事件接入:基于 XComponent 的事件监控回调,在 QPA 的 InputContext 实现中实现对 XComponent 的输入监控,将监控的输入转换为 Qt Event 发送到 Qt Event 队列中,由 Qt 框架实现对输入的处理,完成对触屏操作和鼠标操作的处理。
基于 NAPI 的应用框架接口调用:基于 OpenHarmony 的应用接口规范,部分接口未提供 NDK 接口,需要通过 Node.JS 的 C++插件 NAPI 调用 ETS SDK 的接口进行实现,QPA For OpenHarmony 部分系统接口采用该种方式完成对系统接口的调用,例如系统剪切板。
基于 TS 脚本自定义符合 Qt 标准的对话框:Qt 上层接口的 QMessageBox 支持系统默认样式对话框弹出,该接口在 OpenHarmony 的 SDK 中有提供,由于参数差异,无法通过 NAPI 直接调用,我们采用 ETS 语言实现后导入到 DialogHelpers 中进行使用。目前系统输入法采用 NAPI 接口进行调用,通过 Custom ETS 实现对系统输入法的调用进行监控,再传入 Qt Input Context 转换为 Qt Key Event 输入到 Qt 框架,由于输入法的高性能要求,后续会与 OpenHarmony 团队进行沟通,考虑开放系统底层输入法 NDK 接口。
3.2►►Qt For OpenHarmony 应用管理
符合 OpenHarmony 标准的应用管理:
● 启动流程:(1)Qt 框架按照 Stage 模型开发符合 Stage-Ability,应用程序通过 EntryAbility 调用启动;(2)在 QtAbilityStage 的 onCreate 中,使用 NAPI 机制初始化 Qt 的 Native 模块,并调用 App 自己的 main 入口函数,拉起应用逻辑。
● 退出流程:在 EntryAbility 的 onDestory 中,使用 NAPI 机制通知 Qt 的 QPA 模块,退出 Qt Framework 的主循环及业务逻辑。
与传统的 C++应用程序不同,遵循 Openharmony 的北向开发应用管理,需要通过 eTS 框架完成应用程序 C/C++应用程序 main 函数入口调用启动。
由于 XComponent 的动态创建问题,目前 QPA 的 NAPI 函数调用放在 index.ets 中进行调用,该问题还需要与 OpenHarmony 团队进行沟通,讨论基于 OpenHarmony 的最优解:(1)基于 ETS 框架自定义 ETS 脚本,实现 XComponent 的动态创建,在 ETS 框架下实现应用程序窗口管理;(2)基于 NDK 开发的 XComponent 的新增接口,在 Qt App 侧实现应用程序的窗口管理。
04►总结与展望
基于 Qt 跨平台特性及 Qt For OpenHarmony 的适配,能够促进 OpenHarmony 跨平台应用迁移及应用开发,对 OpenHarmony 技术生态有一定的积极作用,期待大家一块参与到 Qt 适配 OpenHarmony 的相关工作中来。
点击关注了解更多OpenHarmony TSC技术干货内容