Qt For OpenHarmony

本文转载自 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技术干货内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/132880.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows系统docker中将vue项目网站部署在nginx上

一、首先在windows系统上下载并安装docker,要下载windows版本 https://www.docker.com/products/docker-desktop/ PS:安装过程中需要WSL,我的是win11系统,直接提示了我安装就可以下一步了。其他windows系统版本我不知道是否需要单…

C++下标运算符详解

C++ 规定,下标运算符[ ]必须以成员函数的形式进行重载。该重载函数在类中的声明格式如下: 返回值类型 & operator[ ] (参数); const 返回值类型 & operator[ ] (参数) const; 使用第一种声明方式,[ ]不仅可以访问元素,还可以修改元素。使用第二种声明方式,[ ]只…

postgresql-通用表达式

postgresql-通用表达式 入门案例简单CTE递归 CTE案例1案例2 入门案例 -- 通用表达式 with t(n) as (select 2) select * from t;简单CTE WITH cte_name (col1, col2, ...) AS (cte_query_definition ) sql_statement;WITH 表示定义 CTE,因此 CTE 也称为 WITH 查询…

河北省图书馆典藏《乡村振兴振兴战略下传统村落文化旅游设计》许少辉八一新著

河北省图书馆典藏《乡村振兴振兴战略下传统村落文化旅游设计》许少辉八一新著

Nginx(动静分离、分配缓冲区、资源缓存、防盗链、资源压缩、IP黑白名单、大文件传输配置、跨域配置、高可用、性能优化)

Nginx,负载均衡,Http反向代理服务器,支持大部分协议,如TCP、UDP、SMTP、HTTPS 环境搭建 Nginx反向代理-负载均衡 首先通过SpringBootFreemarker快速搭建一个WEB项目:springboot-web-nginx,然后在该项目中&…

FastJSON将对象转JSON字符串引发的血案

问题:最近工作中需要将一个将近两百页的pdf的base64作为value转成JSON字符串,而代码中使用的方案就是JSONObject.toJSONString(obj); 而结果就是引发了OOM内存溢出。 翻阅源码找到一段关键点: 也就是说FastJSON内部设置了一个阈值&#xff…

C++模版基础

代码地址 gitgithub.com:CHENLitterWhite/CPPWheel.git 专栏介绍 本专栏会持续更新关于STL中的一些概念,会先带大家补充一些基本的概念,再慢慢去阅读STL源码中的需要用到的一些思想,有了一些基础之后,再手写一些STL代码。 (如果你…

深入了解MySQL中的JSON_ARRAYAGG和JSON_OBJECT函数

在MySQL数据库中,JSON格式的数据处理已经变得越来越常见。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它可以用来存储和表示结构化的数据。MySQL提供了一些功能强大的JSON函数,其中两个关键的函数是…

奶牛个体识别 奶牛身份识别

融合YOLOv5s与通道剪枝算法的奶牛轻量化个体识别方法 Light-weight recognition network for dairy cows based on the fusion of YOLOv5s and channel pruning algorithm 论文链接 知网链接 DOI链接 该文章讨论了奶牛花斑、光照条件、不同剪枝方法、不同剪枝率对准确率的影响…

类和对象(3)

文章目录 1.回顾上节2. 拷贝构造3. 运算符重载(非常重要)4. 赋值运算符重载 1.回顾上节 默认成员函数:我们不写,编译器自动生成。我们不写,编译器不会自动生成 默认生成构造和析构: 对于内置类型不做处理对…

PMP-项目规划过程组的重要性

一、什么是项目规划过程组 规划过程组包括明确项目全部范围、定义和优化目标,并为实现目标制定行动方案的一组过程。规划过程组中的过程制定项目管理计划的组成部分,以及用于执行项目的项目文件。取决于项目本身的性质,可能需要通过多轮反馈来…

使用阿里PAI DSW部署Stable Diffusion WebUI

进入到网址https://pai.console.aliyun.com/里边。 点击创建实例。 把实例名称填写好,选择GPU规格,然后选择实例名称是ecs.gn6v-c8g1.2xlarge。 选择stable-diffusion-webui-env:pytorch1.13-gpu-py310-cu117-ubuntu22.04,然后点击下一步。…

Python+requests编写的自动化测试项目

框架产生目的:公司走的是敏捷开发模式,编写这种框架是为了能够满足当前这种发展模式,用于前后端联调之前(后端开发完接口,前端还没有将业务处理完毕的时候)以及日后回归阶段,方便为自己腾出学(m…

C++之保存编译全部中间文件(二百一十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

【持续记录】深度学习环境配置

1080面对Transformer连勉强也算不上了,还是要去用小组公用的卡 完整记一个环境配置,方便后面自用✍️ nvidia-smi查看GPU信息 ** CUDA版本12.2 conda -V查询conda版本 22.9.0 新建conda环境 准备装python3.8 conda create --name caiman python3.8.2激…

04-JVM对象创建深度剖析

上一篇:03-JVM内存模型剖析与优化 对象创建的主要流程: 1.类加载检查 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有…

ppt录制在哪?实用技巧分享!

在现代演示和培训中,PPT演示已经成为越来越流行的一种交流方式。而录制ppt也成为了很多商务演讲、教学讲解、产品演示等场合的必备技能。本文将为您介绍两种常见的ppt录制方式,帮助您轻松录制ppt演示的过程。 ppt录制在哪? ppt是一款流行的演…

【扩散模型】4、Improved DDPM | 引入可学习方差和余弦加噪机制来提升 DDPM

文章目录 一、背景二、Improved DDPM——提升 Log-likelihood2.1 可学习的方差2.2 改进 noise schedule2.3 降低梯度噪声 三、效果 论文:Improved Denoising Diffusion Probabilistic Models 代码:https://link.zhihu.com/?targethttps%3A//github.com…

【ELK】日志分析系统概述及部署(ELFK部署实验)

目录 一、ELK概述 1、ELK是什么? 2、ELK的组成部分 2.1 ElasticSearch (1)分片和副本 (2)es和传统数据库的区别 2.2 Kiabana 2.3 Logstash (1)Log Stash主要组件 2.4 可添加的其它组件…

YOLO DNF辅助教程完结

课程完结!撒花、撒花、撒花 课程完结!撒花、撒花、撒花 课程完结!撒花、撒花、撒花 ​呕心沥血三个月,《利用人工智能做DNF游戏辅助》系列实战课程已完结,技术路线贯穿串口通信、目标检测、opencv特征匹配等前沿技术…