一、问题背景

手上有一块 OK3506 开发板,系统为 Buildroot 嵌入式 Linux。系统启动后,Qt 应用 New_Jydl 可以正常显示,但是默认是 竖屏显示。现在需要将屏幕改成 横屏显示。

开发板系统信息如下:

root@ok3506-buildroot:~# uname -a
Linux ok3506-buildroot 6.1.99 #8 SMP PREEMPT Thu May  7 11:23:40 CST 2026 armv7l GNU/Linux

可以看出:

系统类型:嵌入式 Linux
构建系统:Buildroot
内核版本:Linux 6.1.99
CPU架构:32 位 ARM,armv7l

二、最开始尝试 eglfs 旋转失败

一开始按照 Qt 嵌入式常见方式尝试:

export QT_QPA_PLATFORM=eglfs
export QT_QPA_EGLFS_ROTATION=90
./New_Jydl

或者:

export QT_QPA_PLATFORM=eglfs
export QT_QPA_EGLFS_INTEGRATION=eglfs_kms
export QT_QPA_EGLFS_ROTATION=90
./New_Jydl

结果报错:

qt.qpa.plugin: Could not find the Qt platform plugin "eglfs" in "/usr/lib/qt/plugins"
This application failed to start because no Qt platform plugin could be initialized.

Available platform plugins are: linuxfb, minimal, offscreen, vnc.

说明当前系统 Qt 里面没有编译 eglfs 插件。


三、查看 Qt 平台插件

执行:

find /usr/lib/qt/plugins -maxdepth 3 -type f

输出中可以看到 Qt 目前只有:

/usr/lib/qt/plugins/platforms/libqminimal.so
/usr/lib/qt/plugins/platforms/libqvnc.so
/usr/lib/qt/plugins/platforms/libqoffscreen.so
/usr/lib/qt/plugins/platforms/libqlinuxfb.so

也就是说,当前 Qt 平台插件只有:

linuxfb
minimal
offscreen
vnc

没有:

eglfs
wayland
xcb

所以不能使用:

QT_QPA_PLATFORM=eglfs
QT_QPA_EGLFS_ROTATION=90

四、查看显示设备

继续查看系统显示设备:

ls /dev/fb*

结果:

ls: cannot access '/dev/fb*': No such file or directory

说明系统没有传统 framebuffer 设备 /dev/fb0。

再查看 DRM 设备:

ls /dev/dri/

输出:

by-path  card0  renderD128

查看 DRM 输出接口:

ls /sys/class/drm/

输出:

card0  card0-DSI-1  renderD128  version

查看屏幕连接状态:

cat /sys/class/drm/card0-*/status 2>/dev/null

输出:

connected

说明当前屏幕接口是:

DRM/KMS
DSI-1

不是传统 framebuffer。


五、关键环境变量:QT_QPA_FB_DRM=1

查看 Qt 相关环境变量:

env | grep QT

输出:

QT_QPA_FB_DRM=1
QT_QPA_FONTDIR=/usr/share/fonts
QT_IM_MODULE=qtvirtualkeyboard
QT_DEBUG_PLUGINS=1
QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/qt/plugins

这里最关键的是:

QT_QPA_FB_DRM=1

这说明虽然 Qt 加载的是 linuxfb 插件,但是它不是通过 /dev/fb0 显示,而是通过 DRM dumb buffer 方式使用 /dev/dri/card0 输出。

也就是说,当前实际显示链路是:

New_Jydl
  ↓
Qt linuxfb 插件
  ↓
QT_QPA_FB_DRM=1
  ↓
DRM/KMS
  ↓
/dev/dri/card0
  ↓
DSI-1 屏幕

通过 Qt debug 日志也可以确认,程序实际加载的是:

loaded library "/usr/lib/qt/plugins/platforms/libqlinuxfb.so"

并且系统确实扫描到了 libqlinuxfb.so 平台插件。


六、最终可用的横屏启动命令

最终测试可用的命令如下:

unset QT_DEBUG_PLUGINS
unset QT_QPA_EGLFS_ROTATION
unset QT_QPA_EGLFS_INTEGRATION

export QT_QPA_FB_DRM=1
export QT_QPA_PLATFORM=linuxfb:rotation=90

./New_Jydl

执行后,Qt 程序从竖屏切换为横屏显示。

其中关键配置是:

export QT_QPA_FB_DRM=1
export QT_QPA_PLATFORM=linuxfb:rotation=90

含义如下:

配置作用
QT_QPA_FB_DRM=1让 Qt linuxfb 插件走 DRM/KMS 显示路径
QT_QPA_PLATFORM=linuxfb:rotation=90使用 linuxfb 平台插件,并旋转 90 度
./New_Jydl启动 Qt 应用程序

如果方向相反,可以尝试:

export QT_QPA_PLATFORM=linuxfb:rotation=270

或者:

export QT_QPA_PLATFORM=linuxfb:rotation=180

七、整理后的手动启动脚本

可以写一个手动启动脚本,例如:

vi /root/start_new_jydl.sh

内容如下:

#!/bin/sh

unset QT_DEBUG_PLUGINS
unset QT_QPA_EGLFS_ROTATION
unset QT_QPA_EGLFS_INTEGRATION

export QT_QPA_FB_DRM=1
export QT_QPA_FONTDIR=/usr/share/fonts
export QT_IM_MODULE=qtvirtualkeyboard
export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/qt/plugins
export QT_QPA_PLATFORM=linuxfb:rotation=90

cd /root
./New_Jydl

添加执行权限:

chmod +x /root/start_new_jydl.sh

以后启动:

/root/start_new_jydl.sh

八、设置开机自动横屏启动

如果希望开机自动启动 Qt 程序,可以新建 Buildroot init 脚本:

vi /etc/init.d/S99New_Jydl

写入:

#!/bin/sh

case "$1" in
  start)
    echo "Starting New_Jydl..."

    unset QT_DEBUG_PLUGINS
    unset QT_QPA_EGLFS_ROTATION
    unset QT_QPA_EGLFS_INTEGRATION

    export QT_QPA_FB_DRM=1
    export QT_QPA_FONTDIR=/usr/share/fonts
    export QT_IM_MODULE=qtvirtualkeyboard
    export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/qt/plugins
    export QT_QPA_PLATFORM=linuxfb:rotation=90

    cd /root
    ./New_Jydl &

    ;;
  stop)
    echo "Stopping New_Jydl..."
    killall New_Jydl
    ;;
  restart)
    $0 stop
    sleep 1
    $0 start
    ;;
  *)
    echo "Usage: $0 {start|stop|restart}"
    exit 1
    ;;
esac

exit 0

添加执行权限:

chmod +x /etc/init.d/S99New_Jydl
sync
reboot

重启后,程序会自动以横屏方式启动。


九、触摸屏方向处理

当前触摸屏信息如下:

cat /proc/bus/input/devices

可以看到:

N: Name="Goodix Capacitive TouchScreen"
H: Handlers=event0

所以触摸节点是:

/dev/input/event0

如果屏幕横屏后触摸方向不对,可以尝试添加 Qt evdev 触摸参数:

export QT_QPA_GENERIC_PLUGINS=evdevtouch:/dev/input/event0
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0:rotate=90

完整启动示例:

unset QT_DEBUG_PLUGINS
unset QT_QPA_EGLFS_ROTATION
unset QT_QPA_EGLFS_INTEGRATION

export QT_QPA_FB_DRM=1
export QT_QPA_FONTDIR=/usr/share/fonts
export QT_IM_MODULE=qtvirtualkeyboard
export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/qt/plugins
export QT_QPA_PLATFORM=linuxfb:rotation=90

export QT_QPA_GENERIC_PLUGINS=evdevtouch:/dev/input/event0
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0:rotate=90

cd /root
./New_Jydl

如果触摸方向反了,可以把:

rotate=90

改成:

rotate=270

或者继续根据实际触摸方向调整。


十、问题总结

本次问题的核心不是简单地设置 QT_QPA_EGLFS_ROTATION,因为当前系统根本没有 eglfs 插件。

最终确认系统环境如下:

系统:Buildroot 嵌入式 Linux
内核:Linux 6.1.99
架构:armv7l,32 位 ARM
显示接口:DRM/KMS,DSI-1
Qt 平台插件:linuxfb、minimal、offscreen、vnc
实际 Qt 显示后端:linuxfb + QT_QPA_FB_DRM=1

最终可用方案:

export QT_QPA_FB_DRM=1
export QT_QPA_PLATFORM=linuxfb:rotation=90
./New_Jydl

一句话总结:

该 Buildroot 系统没有 eglfs,也没有 /dev/fb0,但 Qt 通过 QT_QPA_FB_DRM=1 使用 linuxfb 插件走 DRM/KMS 显示,因此可以通过 linuxfb:rotation=90 实现横屏显示。

十一、排查思路记录

以后遇到类似问题,可以按下面顺序排查:

uname -a
env | grep QT
find /usr/lib/qt/plugins -maxdepth 3 -type f
ls /dev/fb*
ls /dev/dri/
ls /sys/class/drm/
cat /sys/class/drm/card0-*/status 2>/dev/null
cat /proc/bus/input/devices

如果 Qt 报:

Available platform plugins are: linuxfb, minimal, offscreen, vnc.

说明不能使用 eglfs。

如果没有:

/dev/fb0

但有:

/dev/dri/card0

并且存在:

QT_QPA_FB_DRM=1

那么可以优先尝试:

export QT_QPA_FB_DRM=1
export QT_QPA_PLATFORM=linuxfb:rotation=90
./你的Qt程序

本次问题到这里解决。

更多推荐