Qt Platform Abstraction(QPA)

1、QPA即Qt Platform Abstraction,是Qt5里面的平台抽象层,用以取代Qt for Embedded Linux以及Qt4中的平台接口。QPA插件通过定义QPlatform开头的一系列类的子类实现,其中有两个根类,QPlatformIntegration和QPlatformTheme,前者用于窗口系统的集成,后者用于更深层次的平台主题化和集成,QStyle不属于QPA,相关类如下所示。

QPlatformIntegration
–QAbstractEventDispatcher
–QPlatformAccessibility
–QPlatformBackingStore
–QPlatformClipboard
–QPlatformCursor
–QPlatformDrag
–QPlatformFontDatabase
–QPlatformGraphicsBuffer
–QPlatformInputContext
–QPlatformNativeInterface
–QPlatformOffscreenSurface
–QPlatformOpenGLContext
–QPlatformScreen
–QPlatformServices
–QPlatformSharedGraphicsCache
–QPlatformSurface
–QPlatformWindow

QPlatformTheme
–QPlatformDialogHelper
–QPlatformMenu
–QPlatformMenuBar
–QPlatformMenuItem
–QPlatformSystemTrayIcon
–platform palettes
–platform fonts
–theme hints

在Qt源码的qtbase/src/platformsuports目录下有几个有帮助的类,用于实现QPA插件。需要注意的是,QPA相关的类不保证代码和二进制文件的兼容性,也就是说,一个平台插件只有与之Qt版本相匹配才能正常运行,API变化时会反应到次版本中。与Qt4的QWS不同,介绍开发QPA插件的文档很少,不过在源码中有两个例子可以参考,qtbase/src/plugins/platforms/minimal和qtbase/src/plugins/platforms/minimalegl。

2、Qt for Embedded Linux

Qt5使用QPA替换Qt4的QWS,单进程跑GUI程序时QPA是个很好的选择,如果是多进程,则使用Wayland。在嵌入式Linux系统中,有许多平台插件,如EGLFS、LinuxFB、DirectFB、XCB、Wayland,具体使用哪一个,可通过配置选择,在许多板子上默认选择了eglfs,选择其它插件时可设置QT_QPA_PLATFORM环境变量或-platform命令行参数。编译源码时,需要选择或修改qtbase/mkspecs/devices目录下设备相关的编译配置文件,包括toolchain和sysroot,如果是硬件加速相关的,还需要硬件供应商特定的EGL和OpenGL ES代码,不过对于LinuxFB这种只进行软描画的情况来说是不需要硬件加速的,所谓的硬件加速就是通过GPU分担CPU的图形计算工作。

EGLFS——
EGL是OpenGL和本地窗口系统之间的接口,Qt可以使用EGL管理Context和Surface,但EGL的API是与平台无关的,因此需要专门的代码来适配特定平台的Board或GPU,这可以通过eglfs HOOK或EGL插件实现。EGLFS是个平台插件,在EGL和OpenGL ES 2.0上运行Qt5程序,而不需要像X11、Wayland一样有实际的窗口系统,支持Qt Quick 2、OpenGL程序,以及如QWidget的软描画窗口,软描画使用CPU进行渲染,渲染好的图像数据再上传至纹理、合成。设备包括GPU时,推荐使用EGLFS。因为EGLFS只有一个Native的Window和Window Surface,所以把第一个top-level的窗口作为全屏,且是其它所有窗口的根节点,可以很好地管理窗口的生命周期。基于OpenGL的窗口有一定的限制,例如Qt5.3,EGLFS只支持一个全屏窗口,如果打开其它的窗口或者混用不同类型的窗口将出错。

LinuxFB——
LinuxFB通过Linux的fb设备节点,直接向Framebuffer写数据,只支持软描画,有些情况下显示性能会有所限制。在Qt5.9中,支持DRM dumb buffer,以取代Linux内核弃用的fb,通过DRM API进行描画,类似于eglfs_kms对eglfs的支持,提供了双缓冲、页面跳转以及vsync信号。

DirectFB——
硬件图形加速。

XCB——
X11插件。

Wayland——
轻量级的窗口系统。

其它——
Input:libinput、tslib、libudev、Mouse、Keyboard、Touch、Tablet
Display:drm、kms
Video Memory:保证显存容量。
Unix Signal Handler
Font

【参考】Qt Platform Abstraction | Qt 5.15
【参考】Qt for Embedded Linux | Qt 5.15

你可能感兴趣的:(qt,开发语言)