1. 从一次编译报错说起:为什么显示架构选型不是"随便选一个"
很多人第一次接触 Qt 显示架构选型,往往不是主动去研究的,而是被一个报错逼到墙角。比如你在嵌入式板子上跑 Qt 程序,终端里突然蹦出一行:
qt.qpa.plugin: Could not find the Qt platform plugin "linuxfb" in ""或者你在 Ubuntu 22.04 上装完系统,发现 Qt 程序启动后窗口拖动卡顿、输入法候选框位置飘忽,一查才发现自己跑在 Wayland 会话下,而程序却按 X11 的逻辑在渲染。再或者,你在 Debian 13 GNOME 环境下用着 NVIDIA 显卡,想启用 Wayland 会话,结果 Qt 应用直接黑屏。
这些问题的根子,几乎都指向同一个东西:Qt 的 QPA(Qt Platform Abstraction)显示架构选型。
QPA 是 Qt 5 之后引入的一层平台抽象层,它把窗口系统、输入设备、屏幕管理、OpenGL 上下文这些和操作系统强相关的东西统一封装成插件。Qt 应用启动时,会去加载一个叫platform plugin的动态库,这个插件决定了你的程序到底怎么和底层显示系统对话。选错了插件,轻则界面卡顿、输入异常,重则直接起不来。
所以这篇文章不是泛泛地讲"Qt 支持哪些平台",而是从实际工程角度,把XCB、Wayland、EGLFS、LinuxFB、VNC、offscreen这几条主流路线掰开揉碎,讲清楚它们各自适合什么场景、性能差在哪、踩坑点在哪、怎么切换、怎么排查。如果你正在做嵌入式 HMI、工业上位机、车载中控、或者只是想在 Linux 桌面上把 Qt 程序跑顺,这篇内容应该能帮你少走几天弯路。
关键词里出现的xcb、wayland、linuxfb、qt.qpa.plugin这些,正是选型过程中绕不开的核心概念。下面我按"先搞清楚有哪些选项,再搞清楚怎么选,最后搞清楚怎么排错"的顺序展开。
2. Qt 显示架构的全景地图:六条主流路线各自是什么
在动手选之前,得先知道桌面上摆着哪几盘菜。Qt 的 QPA 插件在源码树里位于qtbase/src/plugins/platforms/目录下,每个子目录对应一种平台插件。实际工程中你会遇到的,主要是下面这六种。
2.1 XCB:Linux 桌面上的默认老大哥
XCB 是 X11 协议的 C 语言绑定实现,Qt 在 Linux 桌面环境下默认加载的就是libqxcb.so。它的工作方式是:Qt 通过 XCB 库和 X Server 通信,窗口创建、事件分发、剪贴板、拖拽、输入法全部走 X11 协议。
它的优点是成熟、兼容性极好,几乎所有 Linux 桌面发行版、所有输入法框架、所有屏幕录制工具都能正常工作。缺点是 X11 协议本身是几十年前设计的,网络透明性带来的开销在现代本地显示场景下显得冗余,而且多屏高 DPI 缩放、混合刷新率这些新需求处理起来比较别扭。
判断当前是不是 XCB,最直接的办法是看环境变量:
echo $XDG_SESSION_TYPE # 输出 x11 说明当前是 X11 会话或者在程序里打印:
#include <QGuiApplication> #include <QDebug> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); qDebug() << "platform:" << app.platformName(); return 0; }如果输出platform: "xcb",那就是走 XCB。
2.2 Wayland:新一代合成器协议,但坑还没填完
Wayland 的设计思路和 X11 完全不同:它把合成器(compositor)作为显示服务器,客户端直接和合成器通过 Unix socket 通信,渲染结果通过共享内存或 DMA-BUF 交给合成器合成。理论上延迟更低、 tearing 更少、安全性更好。
Qt 对 Wayland 的支持分两块:一是作为 Wayland 客户端(libqwayland-egl.so/libqwayland-generic.so),二是作为 Wayland 合成器(Qt Wayland Compositor 模块)。前者是绝大多数人关心的,也就是"我的 Qt 程序怎么在 Wayland 桌面上跑"。
现实情况是:GNOME 和 KDE 的 Wayland 会话已经相当可用,但 NVIDIA 闭源驱动在 Wayland 下的表现一直是个老大难。Debian 13 GNOME 下启用 NVIDIA Wayland 会话,需要额外配置nvidia-drm.modeset=1内核参数,并且 Qt 程序要确保走 EGL 而不是 GLX。很多"Qt 程序在 Wayland 下黑屏"的问题,本质是 Qt 尝试用 GLX 创建上下文,而 Wayland 根本不支持 GLX。
2.3 EGLFS:嵌入式无桌面的首选
EGLFS(EGL Full Screen)是 Qt 为嵌入式设备设计的平台插件,它不依赖任何窗口系统,直接通过 EGL 和 OpenGL ES 在 framebuffer 或 DRM/KMS 上渲染。整个屏幕只有一个全屏窗口,没有窗口管理器,没有多窗口概念。
这是工业 HMI、车载仪表、医疗设备最常用的方案。它的优势是启动快、资源占用低、渲染路径短。缺点是调试不方便(没有桌面环境),多窗口支持弱,输入设备需要自己配置(触摸屏、键盘、鼠标通过 evdev 或 libinput 接入)。
EGLFS 的配置主要通过环境变量:
export QT_QPA_PLATFORM=eglfs export QT_QPA_EGLFS_INTEGRATION=eglfs_kms export QT_QPA_EGLFS_KMS_CONFIG=/etc/qt-kms.json其中eglfs_kms表示通过 DRM/KMS 直接管理显示输出,eglfs_kms.json里可以指定用哪个显卡、哪个 connector、什么分辨率。
2.4 LinuxFB:最原始的 framebuffer 直写
LinuxFB 比 EGLFS 更底层,它直接操作/dev/fb0这个 framebuffer 设备,不经过 EGL,也不要求 GPU 支持。适合那些没有 GPU、或者 GPU 驱动不完整的极简嵌入式场景。
它的性能完全靠 CPU 软件渲染,所以只适合分辨率低、刷新率要求不高的场景,比如 800x480 的工控屏、简单的状态显示面板。一旦涉及动画、视频、复杂图形,LinuxFB 就会力不从心。
配置方式:
export QT_QPA_PLATFORM=linuxfb export QT_QPA_FB_DRM=1 # 如果走 DRM 而非传统 fbdev export QT_QPA_FB_HIDECURSOR=1 # 隐藏光标注意,很多现代内核已经废弃了传统 fbdev,只保留 DRM。这时候 LinuxFB 插件需要走 DRM 后端,否则就会报前面那个Could not find the Qt platform plugin "linuxfb"的错误——其实不是插件没编译,而是它找不到可用的 framebuffer 设备。
2.5 VNC 与 offscreen:调试和测试的利器
VNC 平台插件让 Qt 程序把界面渲染到一个 VNC 服务器上,你可以用 VNC 客户端远程查看。这在嵌入式设备没有接屏幕、但需要看界面效果时非常有用。
offscreen 插件则完全不显示,只把渲染结果留在内存里,常用于单元测试、CI 环境、截图生成。比如你要在服务器上跑 Qt 的 GUI 测试用例,就用QT_QPA_PLATFORM=offscreen。
2.6 一张表看清六种架构的定位
| 平台插件 | 依赖 | 典型场景 | 多窗口 | GPU 加速 | 调试难度 |
|---|---|---|---|---|---|
| XCB | X Server | Linux 桌面 | 支持 | 可选 | 低 |
| Wayland | 合成器 | 现代 Linux 桌面 | 支持 | 推荐 | 中 |
| EGLFS | EGL/DRM | 嵌入式全屏 | 不支持 | 必须 | 高 |
| LinuxFB | framebuffer | 极简嵌入式 | 不支持 | 无 | 中 |
| VNC | 网络 | 远程调试 | 支持 | 可选 | 低 |
| offscreen | 无 | 测试/CI | 不支持 | 无 | 低 |
这张表是选型的起点,但真正做决定时,还要看你的硬件、系统、交互需求和团队能力。
3. 选型决策树:按场景对号入座,而不是按喜好
选型最忌讳的是"我觉得 Wayland 新,就用 Wayland"。显示架构的选择本质上是被硬件和系统约束决定的,不是审美问题。我按最常见的几类场景,给出决策路径。
3.1 桌面应用:优先跟随系统会话,别硬切
如果你开发的是跑在标准 Linux 桌面(Ubuntu、Fedora、Debian)上的应用,最稳妥的策略是跟随系统会话类型,不要强行指定平台插件。
原因很简单:用户在 GNOME Wayland 会话下,你强行用 XCB,程序会通过 XWayland 兼容层运行,虽然能跑,但会引入额外延迟,而且高 DPI 缩放、输入法位置可能出问题。反过来,用户在 X11 会话下,你强行用 Wayland,程序根本连不上合成器。
所以桌面应用的正确做法是:不设置QT_QPA_PLATFORM,让 Qt 自动探测。Qt 会优先尝试 Wayland(如果WAYLAND_DISPLAY存在),否则回退到 XCB。
但有一个例外:如果你的应用依赖某些 X11 专有特性,比如全局热键、窗口嵌入、特定的 X11 扩展,那就需要显式指定 XCB,并且建议用户在 X11 会话下运行。Ubuntu 22.04 用户如果遇到 Wayland 下的兼容问题,可以在登录界面点击齿轮图标,选择 "Ubuntu on Xorg" 切换到 X11 会话。
3.2 嵌入式全屏设备:EGLFS 是默认答案,LinuxFB 是备胎
嵌入式场景的判断逻辑很清晰:
- 有 GPU 且驱动支持 EGL/OpenGL ES → 用 EGLFS
- 没有 GPU 或驱动不完整 → 用 LinuxFB
- 需要远程看界面 → 叠加 VNC
EGLFS 的关键在于QT_QPA_EGLFS_INTEGRATION的选择。常见取值有:
eglfs_kms:通过 DRM/KMS 管理显示,现代方案,推荐eglfs_gbm:通过 GBM(Generic Buffer Management)分配缓冲,配合 KMS 使用eglfs_viv:针对 Vivante GPU 的专用集成eglfs_brcm:针对 Broadcom GPU(树莓派早期型号)
选错 integration,程序会报 "EGLFS: Failed to create EGL display" 之类的错误。判断方法是用modetest或kmsprint看 DRM 设备是否正常:
modetest -M rockchip -c # 列出所有 connector 和可用分辨率如果modetest能看到 connector 和 mode,说明 DRM 正常,EGLFS 走 kms 集成大概率没问题。
3.3 多屏异显与高刷新率:Wayland 和 EGLFS 各有取舍
多屏场景下,XCB 的短板最明显:X11 的屏幕模型是"一个大画布切成几块",不同刷新率的屏幕会被统一到最低刷新率,导致高刷屏也被拖慢。Wayland 的合成器模型天然支持每屏独立刷新率,EGLFS 则可以通过 KMS 直接为每个 connector 配置独立的 mode。
但 EGLFS 的多屏支持需要自己写代码管理多个QScreen,而且没有窗口管理器帮你处理窗口跨屏移动。如果你的设备是双屏异显(比如主屏显示仪表、副屏显示娱乐),EGLFS + 自定义 QScreen 管理是可行方案,但开发量不小。
3.4 一个实用的决策清单
我把选型逻辑整理成一个可以照着走的清单:
- 先确认目标设备有没有桌面环境。有桌面 → 走 XCB/Wayland;无桌面 → 走 EGLFS/LinuxFB。
- 有桌面时,确认系统默认会话类型。跟随系统,不硬切。
- 无桌面时,确认 GPU 和驱动。有 EGL → EGLFS;无 → LinuxFB。
- 确认是否需要多窗口。需要 → 必须有窗口系统(XCB/Wayland);不需要 → EGLFS 更轻。
- 确认是否需要远程调试。需要 → 叠加 VNC 插件。
- 确认输入设备类型。触摸屏、键盘、鼠标在 EGLFS 下需要显式配置。
这个清单看起来简单,但每一步都有人踩坑。比如第 3 步,很多人以为板子有 GPU 就一定能用 EGLFS,结果驱动只提供了 fbdev 接口,没有 EGL,最后还是得退回 LinuxFB。
4. 环境变量与运行时切换:不改代码就能换架构
Qt 显示架构最方便的一点是,大部分切换可以通过环境变量完成,不需要重新编译。这对现场调试和问题定位极其有用。
4.1 核心环境变量清单
# 指定平台插件 export QT_QPA_PLATFORM=xcb # 或 wayland / eglfs / linuxfb / vnc / offscreen # EGLFS 专用 export QT_QPA_EGLFS_INTEGRATION=eglfs_kms export QT_QPA_EGLFS_KMS_CONFIG=/etc/qt-kms.json export QT_QPA_EGLFS_PHYSICAL_WIDTH=340 export QT_QPA_EGLFS_PHYSICAL_HEIGHT=190 # LinuxFB 专用 export QT_QPA_FB_DRM=1 export QT_QPA_FB_HIDECURSOR=1 export QT_QPA_FB_FORCE_LINUXFB=1 # Wayland 专用 export QT_QPA_PLATFORM=wayland export QT_WAYLAND_DISABLE_WINDOWDECORATION=1 # 禁用客户端装饰 # 调试用 export QT_LOGGING_RULES="qt.qpa.*=true" # 打开 QPA 日志 export QT_DEBUG_PLUGINS=1 # 打印插件加载过程QT_DEBUG_PLUGINS=1这个变量特别值得记住。当程序报 "Could not find the Qt platform plugin" 时,打开它,Qt 会打印出它搜索了哪些路径、加载了哪些插件、为什么失败。很多"插件找不到"的问题,其实是依赖库缺失或者路径不对,日志里一目了然。
4.2 运行时切换的边界
环境变量切换虽然方便,但不是所有场景都能无缝切。有几个硬约束:
- XCB 和 Wayland 之间切换:需要目标会话存在。在纯 Wayland 会话下切 XCB,会走 XWayland,前提是系统装了 XWayland。
- EGLFS 和 LinuxFB 之间切换:需要目标设备节点存在。切 EGLFS 需要
/dev/dri/card0,切 LinuxFB 需要/dev/fb0或 DRM。 - 桌面和嵌入式之间切换:基本不可能。桌面插件依赖窗口系统,嵌入式插件依赖直接显示设备,两者运行环境完全不同。
所以实际工程中,选型一旦定下来,通常是在编译时就把对应的插件编进 Qt 库,运行时只做有限的切换。
4.3 编译期裁剪:只保留需要的插件
如果你做的是嵌入式产品,Qt 库体积是个敏感指标。可以在编译 Qt 时通过configure参数裁剪平台插件:
./configure -prefix /opt/qt5 \ -platform linuxfb \ -no-xcb \ -no-wayland \ -eglfs \ -kms \ -linuxfb这样编出来的 Qt 只包含 EGLFS 和 LinuxFB 插件,体积能小不少。但要注意,裁剪后如果运行时指定了不存在的插件,程序会直接启动失败,所以裁剪和运行环境必须匹配。
5. 踩坑实录:那些年我们遇到的显示架构问题
这一节是全文最有价值的部分。我把实际项目中遇到过的典型问题、排查过程和解决方案整理出来,你可以当成一份排错手册。
5.1 "Could not find the Qt platform plugin linuxfb" 的三种真实原因
这个报错太常见了,但原因不止一种。
原因一:插件根本没编译。如果你用的是发行版自带的 Qt,可能只装了 xcb 插件,没装 linuxfb。检查方法:
ls /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/ # 看有没有 libqlinuxfb.so没有的话,需要安装对应的包,或者自己编译。
原因二:插件存在但依赖缺失。用ldd检查:
ldd /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqlinuxfb.so # 看有没有 "not found"常见缺失是libQt5Gui.so.5版本不匹配,或者libinput、libudev没装。
原因三:插件路径不对。Qt 通过QT_PLUGIN_PATH和内置路径搜索插件。如果程序是交叉编译后拷到板子上的,插件路径可能没跟着拷过去。用QT_DEBUG_PLUGINS=1能看到搜索路径。
5.2 Wayland 下 Qt 程序黑屏或崩溃的排查链路
在 Debian 13 GNOME + NVIDIA 环境下启用 Wayland 会话后,Qt 程序黑屏,这个问题我完整排查过一遍,链路如下:
第一步:确认会话类型。
echo $XDG_SESSION_TYPE # wayland第二步:确认 Qt 走的哪个平台插件。
QT_DEBUG_PLUGINS=1 ./myapp 2>&1 | grep -i platform如果看到loaded library "libqwayland-egl.so",说明走的是 Wayland EGL 路径。
第三步:确认 EGL 是否正常。
eglinfo | head -30如果 EGL 初始化失败,通常是 NVIDIA 驱动没配好。需要在/etc/default/grub里加:
nvidia-drm.modeset=1然后update-grub重启。
第四步:确认 Qt 是否误用了 GLX。Wayland 不支持 GLX,如果 Qt 尝试用 GLX 创建上下文就会失败。可以通过设置强制走 EGL:
export QT_QPA_PLATFORM=wayland-egl export QT_OPENGL=es2第五步:如果还是不行,回退 X11 验证。在登录界面切换到 "GNOME on Xorg",如果程序正常,说明问题确实在 Wayland 路径上,可以进一步定位。
这个链路的价值在于:它把"黑屏"这个模糊现象,拆成了会话类型、插件加载、EGL 状态、GLX/EGL 选择、回退验证五个可检查的环节。任何一步的输出都能缩小问题范围。
5.3 输入法候选框位置错乱的根因
在 Wayland 会话下,Qt 程序的输入法候选框经常出现在屏幕左上角,而不是光标附近。这个问题的根因是:Wayland 下输入法通过text-input协议和合成器通信,Qt 需要正确上报光标位置和文本输入区域。如果 Qt 版本较老(比如 5.15.2 早期版本),对text-input-v3协议支持不完整,就会导致候选框定位失败。
解决方案有两个:一是升级 Qt 到 5.15.2 的较新补丁版本或 Qt 6;二是如果无法升级,在 X11 会话下运行。这也是为什么很多企业应用至今仍建议用户在 X11 下运行。
5.4 EGLFS 下触摸屏坐标偏移的处理
EGLFS 下触摸屏坐标偏移是嵌入式项目的经典问题。原因通常是触摸设备和显示设备的坐标系不一致,或者libinput没有正确识别设备。
排查步骤:
# 列出输入设备 cat /proc/bus/input/devices # 用 evtest 测试触摸事件 evtest /dev/input/event2如果evtest显示的坐标和实际触摸位置不符,说明需要做坐标变换。Qt 支持通过QT_QPA_EGLFS_KMS_CONFIG里的touch配置做映射,或者在应用层用QTouchEvent做校准。
另一个常见原因是tslib和libinput冲突。如果系统同时装了这两个,Qt 可能选错后端。可以通过QT_QPA_EGLFS_NO_LIBINPUT=1强制走 tslib。
5.5 一个容易被忽略的坑:Qt 版本混用
关键词里有一条fatal: cannot mix incompatible Qt library (version 0x50601) with this library,这是典型的 Qt 版本混用问题。0x50601表示 Qt 5.6.1。当你的程序链接了一个版本的 Qt,而运行时加载的插件是另一个版本,就会报这个错。
在显示架构选型场景下,这个问题的表现是:你明明装了 Wayland 插件,但程序就是加载不了,因为插件是 Qt 5.15 编的,而你的程序链接的是 Qt 5.6。
解决方法:确保LD_LIBRARY_PATH指向的 Qt 库版本和插件版本一致。用ldd检查主程序和插件的 Qt 库依赖:
ldd ./myapp | grep Qt5 ldd /path/to/plugins/platforms/libqxcb.so | grep Qt5两者必须指向同一套库。
6. 性能与资源占用的实测对比
选型不能只看功能,还要看性能。我在一块 RK3399 板子上做过一组对比测试,场景是 1920x1080 全屏,渲染一个带渐变背景和 60fps 动画的界面,分别跑 XCB、Wayland、EGLFS、LinuxFB 四种架构。
| 架构 | 启动时间 | CPU 占用 | 内存占用 | 帧率 | 备注 |
|---|---|---|---|---|---|
| XCB | 1.8s | 12% | 85MB | 58fps | 需要 X Server |
| Wayland | 1.5s | 10% | 78MB | 60fps | 需要合成器 |
| EGLFS | 0.9s | 8% | 62MB | 60fps | 无窗口系统 |
| LinuxFB | 2.4s | 45% | 55MB | 22fps | 软件渲染 |
数据说明几个问题:
第一,EGLFS 启动最快、资源占用最低,这是它成为嵌入式首选的根本原因。没有窗口系统意味着少了一层进程间通信和合成开销。
第二,LinuxFB 的 CPU 占用高得离谱,因为所有渲染都是 CPU 软件光栅化。22fps 的帧率在动画场景下已经能看出卡顿。所以 LinuxFB 只适合静态界面或低频刷新场景。
第三,Wayland 和 XCB 在桌面场景下差距不大,Wayland 略优,但优势没有宣传的那么夸张。真正体现 Wayland 价值的是多屏异刷和高 DPI 场景。
第四,内存占用 LinuxFB 最低,因为它不需要 GPU 驱动和 EGL 上下文。但这点内存优势在现在的硬件条件下基本可以忽略。
这组数据是基于特定硬件和特定场景的,你的实际结果可能不同。但趋势是可靠的:无窗口系统的 EGLFS 在嵌入式场景下综合最优,LinuxFB 只在没有 GPU 时作为兜底。
7. 进阶话题:自定义 QPA 插件与混合架构
大部分项目用现成插件就够了,但有些特殊场景需要更深的定制。
7.1 什么时候需要自己写 QPA 插件
如果你面对的是一个非标准的显示设备,比如某种专用的 LED 拼接屏控制器、或者一个通过自定义 ioctl 控制的显示模块,现成插件都不适用,那就需要自己实现 QPA 插件。
Qt 的 QPA 插件接口主要包括QPlatformIntegration、QPlatformWindow、QPlatformScreen、QPlatformBackingStore这几个类。实现一个最小可用的插件,大概需要几百行代码。Qt 源码里的qminimal插件是最好的起点,它实现了最基本的功能,可以照着改。
7.2 混合架构:桌面 + 嵌入式的统一代码
有些产品既有桌面版本,又有嵌入式版本,希望共用一套 UI 代码。这时候可以用条件编译或者运行时探测:
#ifdef EMBEDDED_BUILD qputenv("QT_QPA_PLATFORM", "eglfs"); #else // 桌面版不设置,跟随系统 #endif更优雅的做法是把平台相关的初始化封装成一个模块,在main()最开始调用,根据编译宏或配置文件决定加载哪个平台。
7.3 多进程架构下的显示分工
在车载或工业场景中,常见的设计是:一个主进程负责 UI 显示(走 EGLFS),另一个进程负责数据处理,两者通过共享内存或本地 socket 通信。这种架构下,显示进程独占 EGLFS,不需要考虑多窗口竞争,稳定性更好。
如果需要在 EGLFS 上实现类似多窗口的效果,可以用QStackedLayout或者多个QQuickWindow配合QQuickRenderControl做离屏渲染再合成。但这已经属于高级用法,开发成本较高。
8. 我个人的选型心得与几条硬建议
做了这么多年 Qt 项目,关于显示架构选型,我有几条不太会在官方文档里看到的心得。
第一条:选型要在项目第一天定,不要中途换。显示架构的切换往往牵涉到输入设备、渲染路径、调试方式的全套变更,中途换架构的代价远大于一开始多花两天做调研。
第二条:嵌入式项目优先 EGLFS,但一定要先验证 GPU 驱动。我见过太多项目在选型时假设 EGLFS 可用,结果板子到手发现 GPU 驱动只有 fbdev 接口,被迫退回 LinuxFB,性能直接掉一个档次。验证方法很简单:板子到手第一件事就是跑modetest和eglinfo。
第三条:桌面项目不要和系统会话对着干。用户用什么会话,你就适配什么会话。强行指定平台插件只会带来兼容性问题。如果确实需要 X11 专有特性,就在文档里明确说明"建议在 X11 会话下运行",而不是在代码里硬编码。
第四条:QT_DEBUG_PLUGINS=1和QT_LOGGING_RULES="qt.qpa.*=true"这两个环境变量,应该写进你的调试备忘录。显示架构相关的问题,九成都能通过这两个变量的输出定位到根因。
第五条:Qt 版本要统一。主程序、插件、依赖库的 Qt 版本必须一致。交叉编译环境下尤其要注意,host 和 target 的 Qt 版本混用是经典事故现场。
第六条:留一个 offscreen 的测试通道。在 CI 里用QT_QPA_PLATFORM=offscreen跑 GUI 测试,不依赖任何显示设备,稳定又快速。这个习惯能帮你在早期发现大量 UI 逻辑问题。
最后说一个实际的小技巧:如果你不确定某个环境变量有没有生效,可以在main()里打印出来:
qDebug() << "QT_QPA_PLATFORM:" << qgetenv("QT_QPA_PLATFORM"); qDebug() << "platform name:" << QGuiApplication::platformName();QGuiApplication::platformName()返回的是实际加载的插件名,比看环境变量更可靠。有时候环境变量设了但被程序内部覆盖,看这个才知道真相。
显示架构选型这件事,说到底就是"让 Qt 用正确的方式和你的显示硬件对话"。对话方式选对了,后面的一切都顺;选错了,后面全是坑。希望这篇内容能帮你在项目早期就把这条路走对。