Qt For OpenHarmony图形化的进展突破

电子说

1.3w人已加入

描述

Qt 适配 OpenHarmony 意义

Qt 是一个 C++ 跨平台开发框架,主要用于开发图形用户界面(Graphical User Interface,GUI)程序,具有跨平台类库(支持目前所有主流软硬件平台组合)、集成开发工具(缩短软件产品上市时间)以及跨平台集成开发环境(高生产力开发环境)等。全球超过 100 万研发者使用过 Qt,Qt 的跨平台开发能力覆盖 70 多个行业,是从 1994 年至今得到广泛的认同和验证的主流技术。
 

OpenHarmony


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 的行业应用推广。

计划贡献内容

适配计划

Qt 按使用及部署划分,包含了设计工具、开发工具、框架必要模块、框架附加模块 4 个部分,基于 OpenHarmony 跨平台开发考虑,总体计划如下:

针对 OpenHarmony 的开发工具进行补充

对 Qt 必要模块进行适配支持

对部分 Qt 附加模块适配支持
 

OpenHarmony


       具体工作如下:

成立 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 工程工具实现快速的应用迁移配置

配套开发工具

Qt 开发者通常使用 Qt 配套的集成开发环境 Qt Creator,采用 qmake 或 cmake 进行软件工程管理配置,为方便开发者对已有软件进行移植适配,我们会开发对应的工程转换工具,将 Qt 的应用工程转换为 DevEco Application 工程,帮助开发者快速实现应用的迁移配置。

技术难点分享

Qt 本身是跨平台的框架,我们要把它跟 OpenHarmony 做移植,无非考虑几个问题:一是 Qt 应用程序的界面如何在 OpenHarmony 上进行显示;OpenHarmony 本身触屏的输入、鼠标 / 键盘的输入怎么能够把它映射到 Qt 本身的应用程序框架里去。需要了解 Qt 的 QPA 实现及系统接口调用的相关逻辑,就能实现 Qt 应用程序在 OpenHarmony 上的运行。

QPA 实现及系统接口调用

Qt 平台抽象(QPA)是 Qt 的平台抽象层,QPA 插件是通过子类化各种 QPlatform * 类来实现系统接口的接入,例如用于窗口系统集成的 QPlatformIntegration 和 QPlatformWindow 以及用于更深层次的平台主题化和集成的 QPlatformTheme。
 

OpenHarmony

QPA 核心对象及作用:通过 QPlatfromIntegration 实现对 QPA 插件的对象声明周期管理,Qt GUI 等模块通过 Qt 已完成的平台抽象层相关类实现对系统底层的调用,其中比较重要的实现类包括:EventDispatcher(实现系统底层事件接入)、BackingStore(系统图形绘制双缓存实现)、Screen(系统屏幕对象,用于管理 Window 显示)、Window(系统窗口对象)、InputContext(系统输入处理,包括鼠标、输入法等)、OpenGLContext(系统窗口 OpenGL 渲染上下文)以及 Clipboard(系统剪切板)。
 

OpenHarmony


Qt Widget For OpenHarmony 渲染流程:基于 Qt 框架自成体系的图形框架和事件系统,在 OpenHarmony 上基于 XComponent 生成的 EGLSurface,采用图像二维绘制的方式在 OpenGL Surface 上实现双缓存渲染机制,完成 Qt Widget 的窗口内容渲染。

OpenHarmonyOpenHarmony

Qt Quick For OpenHarmony 渲染流程:Qt Quick 采用自成体系的 Scene Graph 基于 OpenGL 标准接口实现,QPA OpenHarmony 插件基于 XCompent 生成 EGL Surface,并通过 QPA 标准实现类重载实现 PlatformIntegration 实现与 Scene Graph 的 OpenGLContext 绑定,Qt Quick 基于标准 OpenGL 接口在 XComponent 上实现图形渲染。

OpenHarmonyOpenHarmony

OpenHarmony Touch 事件接入:基于 XComponent 的事件监控回调,在 QPA 的 InputContext 实现中实现对 XComponent 的输入监控,将监控的输入转换为 Qt Event 发送到 Qt Event 队列中,由 Qt 框架实现对输入的处理,完成对触屏操作和鼠标操作的处理。

OpenHarmonyOpenHarmony

基于 NAPI 的应用框架接口调用:基于 OpenHarmony 的应用接口规范,部分接口未提供 NDK 接口,需要通过 Node.JS 的 C++ 插件 NAPI 调用 ETS SDK 的接口进行实现,QPA For OpenHarmony 部分系统接口采用该种方式完成对系统接口的调用,例如系统剪切板。
 

OpenHarmonyOpenHarmony

基于 TS 脚本自定义符合 Qt 标准的对话框:Qt 上层接口的 QMessageBox 支持系统默认样式对话框弹出,该接口在 OpenHarmony 的 SDK 中有提供,由于参数差异,无法通过 NAPI 直接调用,我们采用 ETS 语言实现后导入到 DialogHelpers 中进行使用。目前系统输入法采用 NAPI 接口进行调用,通过 Custom ETS 实现对系统输入法的调用进行监控,再传入 Qt Input Context 转换为 Qt Key Event 输入到 Qt 框架,由于输入法的高性能要求,后续会与 OpenHarmony 团队进行沟通,考虑开放系统底层输入法 NDK 接口。
 

OpenHarmonyOpenHarmony

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 的主循环及业务逻辑。
 

OpenHarmony

与传统的 C++ 应用程序不同,遵循 Openharmony 的北向开发应用管理,需要通过 eTS 框架完成应用程序 C/C++ 应用程序 main 函数入口调用启动。

由于 XComponent 的动态创建问题,目前 QPA 的 NAPI 函数调用放在 index.ets 中进行调用,该问题还需要与 OpenHarmony 团队进行沟通,讨论基于 OpenHarmony 的最优解:(1)基于 ETS 框架自定义 ETS 脚本,实现 XComponent 的动态创建,在 ETS 框架下实现应用程序窗口管理;(2)基于 NDK 开发的 XComponent 的新增接口,在 Qt App 侧实现应用程序的窗口管理。
 

OpenHarmonyOpenHarmony

总结与展望

基于 Qt 跨平台特性及 Qt For OpenHarmony 的适配,能够促进 OpenHarmony 跨平台应用迁移及应用开发,对 OpenHarmony 技术生态有一定的积极作用,期待大家一块参与到 Qt 适配 OpenHarmony 的相关工作中来。


审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分