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

Qt For OpenHarmony的更多相关文章

  1. QT内省机制、自定义Model、数据库

    本文将介绍自定义Model过程中数据库数据源的获取方法,我使用过以下三种方式获取数据库数据源: 创建 存储对应数据库所有字段的 结构体,将结构体置于容器中返回,然后根据索引值(QModelIndex) ...

  2. Ubuntu 下安装QT

    Ubuntu 下安装QT 本文使用的环境 QT Library: qt-everywhere-opensource-src-4.7.4.tar.gz QT Creator: qt-creator-li ...

  3. Qt安装配置

    Qt Creator: 下载: Qt 5.5.1 for Windows 32-bit(MinGW 4.9.2, 1.0 GB):http://download.qt.io/official_rele ...

  4. Qt信号与槽自动关联机制

    参考链接1:http://blog.csdn.net/skyhawk452/article/details/6121407 参考链接2:http://blog.csdn.net/memory_exce ...

  5. 保持Qt GUI响应的几种方法

    最开始使用Qt时就遇到过QT Gui失去响应的问题,我是用多线程的方式解决的,然而通常来说,多线程是会降低程序的运行速度. 之后,在使用QSqlQuery::execBatch()函数时,Qt Gui ...

  6. Qt 中使用Singleton模式需小心

    在qt中,使用Singleton模式时一定要小心.因为Singleton模式中使用的是静态对象,静态对象是直到程序结束才被释放的,然而,一旦把该静态对象纳入了Qt的父子对象体系,就会导致不明确的行为. ...

  7. Qt——组件位置随窗口变化

    当我们用Qt Designer设计界面时,有时会面临这样一个问题:需要在窗口指定位置放置组件,并且当窗口位置大小改变时,该组件相对其父对象的位置是不变的,如下面两幅图所示 ,首先看上面这幅图,注意bu ...

  8. (转) Qt 出现“undefined reference to `vtable for”原因总结

    由于Qt本身实现的机制所限,我们在使用Qt制作某些软件程序的时候,会遇到各种各样这样那样的问题,而且很多是很难,或者根本找不到原因的,即使解决了问题,如果有人问你为什么,你只能回答--不知道. 今天我 ...

  9. qt中ui的 使用介绍

    1.什么是ui?ui通常是用Qt 设计师设计出来的界面文件的后缀.通常情况下ui是一个指向这个界面类的指针.ui-> 一般就是用来访问这个界面类里面的控件.例如你的ui文件里有一个叫okButt ...

  10. Qt 开启鼠标跟踪,自动激活mouseMoveEvent的问题

    最近在Qt上实现一个功能,鼠标在图片上移动,触发mouseMoveEvent事件,进而生成一个小的半透明窗口,放大显示以鼠标为中心的一个区域的图像并随鼠标移动.但是,必须鼠标摁下,才触发mouseMo ...

随机推荐

  1. 基于java的学生信息管理系统

    开发说明:使用数组集合存储临时数据,实现学生信息管理系统,实现的功能有管理员的注册.登陆.增加学生信息.删除学生信息.查询学生信息.修改学生信息.学生信息列表 登陆注册界面 系统首页界面 增加 删除 ...

  2. 【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?

    通过PSLIST查看Windwos中的进程信息及线程信息 一:下载PSLIST小工具:https://docs.microsoft.com/en-us/sysinternals/downloads/p ...

  3. 智能升级:AntSK教你如何让聊天机器人实现智能联网操作

    随着人工智能技术的飞速发展,智能体已经逐步融入到我们的日常生活中.不过,要想让智能体不仅能聊天,还能接入网络实时获取信息,为我们提供更多便利,所需技术的复杂性不得不让人瞩目.今天,我将和各位分享如何在 ...

  4. stm32f103ve+光电传感器使用教程+oled(HAL库)

    最近想做一个物联网农业监控系统,第一步就是能够学会使用相关的外设,比如温湿度检测,光照强度检测,还有CO2检测等. 这次讲一下光电传感器的使用和代码实现. 1.知识储备:串口使用,ADC采集(此处用的 ...

  5. Java 异常处理(2) : 方法重写的规则之一:

    1 package com.bytezero.throwable; 2 3 import java.io.FileNotFoundException; 4 import java.io.IOExcep ...

  6. 在anaconda中为jupyter安装代码自动补全或代码自动提示功能,jupyter nbextensions不显示拓展,另附格式化代码插件的安装方法

    操作步骤 进入命令行环境.我使用的是conda.有两种方式进入命令行. 方法1:通过anconda navigator界面,选择environments,选择对应环境名,选择open terminal ...

  7. [青少年CTF训练平台]web部分题解(已完结!)

    文章管理系统 首先打开环境(>ω<。人)ZZz♪♪ 既然要做题,就要做全面了,图上说了,既然有假flag我就先找出来: 假flag: 打开vmware,使用sqlmap进行处理: sqlm ...

  8. 读书笔记:CSAPP 11章 网络编程

    深入理解计算机系统 第11章 本章代码:Index of /afs/cs/academic/class/15213-f15/www/code/22-netprog2 其中包含本章课本示例代码,测试 T ...

  9. 使用 Docker 部署 Fiora 在线聊天室平台

    一.Fiora 介绍 Fiora 简介 Fiora 是一款开源免费的在线聊天系统. GitHub:https://github.com/yinxin630/fiora Fiora 功能 注册账号并登录 ...

  10. 深入浅出Java多线程(十一):AQS

    引言 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十一篇内容:AQS(AbstractQueuedSynchronizer).大家觉得有用请点赞,喜欢请关注!秀才在此谢 ...