QPA说明

介绍

QWS的全称是Qt windows system,是QT自行开发的窗口系统,体系结构类似X Windows,是一个C/S结构,由QWS Server在物理设备上显示,由QWS Client实现界面,两者通过socket进行彼此的通讯。在很多嵌入式系统里,QT程序基本上都是用QWS来实现,这样保证程序的可移植性。

另外在运行QT程序时添加-qws参数,表示这个程序时QWS Server,否则是QWS Client。任何一个基于QT的application都可以做QWS Server。当然QWS Server一定先于QWS Client启动,否则QWS Client将启动失败。在实际应用中,会指定某个特殊的application做QWS Server,这个application一般还会管理一些其它的系统资源。

QWS Server是如何管理QWS Client的?QWS Server是一个server socket,QWS Client是一个client socket。QWS Client启动时会主动向QWS Server的server socket建立连接。而后就QWS Server通过这个socket传递QWSCommand和QWSEvent来管理QWS Client。

QPA(Qt platform abstruct),Qt平台抽象,移植自Qt4,在Qt5中替代QWS(Qt Window System)

Qt5.0开始,Qt自身不再单独实现窗口系统,QWS不复存在,取而代之的新机制是QPA(Qt平台抽象),QPA使得Qt对不同平台的支持变得更加灵活,当需要支持一个新平台时,只需为该平台编写一个QPA插件。

Qt使用QPA接口显示,在不同的平台使用不同的实现。

  • 嵌入式系统使用eglfs
  • 嵌入式系统还可以使用linuxfb(framebuffer)
  • 在支持WAYLAND的系统使用wayland
  • Windows下使用windows
  • X11桌面环境下使用xcb
  • qnx
  • cocoa
  • minimal

使用

可以在环境变量中设置

1
2
3
4
export QT_DEBUG_PLUGINS=1 #输出调试信息
export QT_QPA_PLATFORM=eglfs #设置后端为eglfs
export QT_LOGGING_RULES=qt.qpa.*=true
export QT_QPA_EGLFS_DEBUG=1

也可以在程序运行时指定

1
./app -platform eglfs

开发

按照Qt_Platform_Abstraction中的说明,API会在小版本中更新(5.1、5.2,按照外国命名规则,5为大版本major,1、2为小版本minor)

官方建议,如果需要自己写一个插件,只能从已有插件入手,minimal开始,xcb/windows/cocoa/qnx都是正常更新的,也可以参考。

QPA插件由一系列QPlatform*类组成,其中有两个根类QPlatformIntegration/QPlatformTheme

其他的还有

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
QPlatformIntegration

QPlatformWindow
QPlatformBackingStore
QPlatformOpenGLContext
QPlatformSharedGraphicsCache
QPlatformFontDatabase
QPlatformClipboard
QPlatformDrag
QAbstractEventDispatcher
QPlatformInputContext
QPlatformAccessibility
QPlatformNativeInterface
QPlatformServices

QPlatformTheme

QPlatformMenu
QPlatformMenuBar
QPlatformDialogHelper
platform palettes
platform fonts
theme hints

可以参考源码中的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-qtbase
|
-src
|
-platformheaders
-platformsupport
-plugins
|
-platforms
|
-eglfs
-android
-linuxfb
-offscreen
-xcb
-...

各个平台都有对应的源码


QPA说明
https://feater.top/qt/introduction-of-qpa/
作者
JackeyLea
发布于
2022年3月26日
许可协议