【QT】QPA

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

【参考】http://doc.qt.io/qt-5/qpa.html
【参考】http://doc.qt.io/qt-5/embedded-linux.html

### 解决树莓派上 Qt QPA XCB 配置或兼容性问题 对于在树莓派上遇到的 `qt.qpa.plugin: Could not load the Qt platform plugin "xcb"` 错误消息,该问题是由于未能初始化任何 Qt 平台插件所引起的。通常情况下,在嵌入式环境中使用 Qt 时,直接依赖于 framebuffer 而不是传统的 X Window System (X11),因此可能不需要 xcb 插件[^2]。 然而,如果确实需要支持基于 XCB 的显示,则可以尝试以下方法来解决问题: #### 方法一:安装必要的库文件 确保已经安装了所有必需的开发包以及运行时库,特别是那些与 XCB 和 Qt 相关的部分。可以通过下面命令完成这些操作: ```bash sudo apt-get update && sudo apt-get install libxcb-xinerama0-dev qtbase5-dev ``` #### 方法二:指定平台插件路径 当启动应用程序时,通过设置环境变量告诉 Qt 去哪里寻找平台插件。可以在终端里执行如下指令后再运行程序: ```bash export QT_QPA_PLATFORM_PLUGIN_PATH=/opt/vc/lib/qt/plugins/platforms/ ./your_application_name ``` 这里假设 `/opt/vc/lib/qt/plugins/platforms/` 是实际存放平台插件的位置,请根据实际情况调整此路径。 #### 方法三:修改构建配置 如果是在编译阶段遇到了这个问题,那么应该检查项目的 `.pro` 文件或其他形式的项目配置文件,确认其中包含了正确的模块声明,并且指定了适当的目标平台选项。例如,在 .pro 文件中加入这样的行可能会有所帮助: ```qmake QT += widgets gui platformsupport CONFIG += link_pkgconfig PKGCONFIG += x11 xcb xcb-icccm xcb-image xcb-shape xcb-sync xcb-xfixes xcb-render-util xcb-render xcb-keysyms ``` 另外,还可以考虑切换到更适合嵌入式系统的其他平台插件,比如 `linuxfb` 或者 `eglfs`,它们不依赖于 X Server 即可工作良好。只需简单更改环境变量即可实现这一点: ```bash export QT_QPA_PLATFORM=linuxfb # 或者 export QT_QPA_PLATFORM=eglfs ``` 以上措施有助于缓解因缺少合适平台插件而导致的应用无法正常启动的问题。值得注意的是,具体解决方案取决于应用的具体需求和部署场景的选择[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值