无X服务器的Linux系统下PyQt5应用启动时的屏幕旋转问题
问题:Ubuntu Server下PyQt5应用在MIPI竖屏上实现横屏显示的方案
环境与问题
搭载Ubuntu Server(无Xorg)的OrangePi4,搭配默认竖屏的MIPI触摸屏。开发的PyQt5应用在HDMI显示器上可正常横屏显示,但切换到MIPI显示屏时呈竖屏状态,需要实现90度旋转的横屏显示,询问是否需修改代码、安装无桌面Xorg或采用其他方案。
当前启动命令
QT_QPA_PLATFORM=linuxfb python3 run.py
已尝试方案
- 查找PyQt5旋转全屏的代码,未解决问题
- 使用fbcon旋转屏幕,仅对控制台有效,启动应用后仍为竖屏
示例应用代码
import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel def window(): app = QApplication(sys.argv) widget = QWidget() textLabel = QLabel(widget) textLabel.setText("Hello World!") textLabel.move(100,100) widget.show() sys.exit(app.exec_()) if __name__ == '__main__': window()
效果说明
HDMI显示器显示正常横屏,MIPI-DSI触摸屏显示为竖屏
解决方案
方案一:修改PyQt5代码实现旋转
利用Qt的图形变换功能对主窗口进行旋转,同时适配屏幕尺寸。若涉及触摸屏,还需处理坐标转换:
import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel from PyQt5.QtGui import QTransform from PyQt5.QtCore import Qt def window(): app = QApplication(sys.argv) widget = QWidget() # 获取屏幕尺寸,旋转后交换宽高 screen = app.primaryScreen() size = screen.size() widget.resize(size.height(), size.width()) textLabel = QLabel(widget) textLabel.setText("Hello World!") textLabel.move(100,100) # 应用90度顺时针旋转变换 transform = QTransform() transform.rotate(90) widget.setTransform(transform) widget.showFullScreen() sys.exit(app.exec_()) if __name__ == '__main__': window()
触摸坐标适配:重写窗口的mousePressEvent等事件,将触摸坐标按反向旋转公式转换后再处理
方案二:通过QT环境变量配置linuxfb旋转
直接给linuxfb平台传递旋转参数,无需修改代码,同时配置触摸坐标对应旋转:
- 启动应用时添加旋转参数:
QT_QPA_PLATFORM=linuxfb:rotation=90 python3 run.py
- 配置触摸坐标旋转:创建
/etc/libinput/local-overrides.quirks文件,添加内容:
[Touchscreen Rotation] MatchUdevType=touchscreen MatchDevicePath=/dev/input/event* AttrCalibrationMatrix=0 1 0 -1 0 1 0 0 1
保存后重启系统或重新加载libinput服务。
方案三:安装轻量无桌面Xorg环境
通过Xorg管理屏幕旋转,应用无需修改:
- 安装必要组件:
sudo apt install xorg xserver-xorg-core xinit
- 创建Xorg旋转配置文件
/etc/X11/xorg.conf.d/90-monitor.conf:
Identifier "DSI-1" Option "Rotate" "right" # right对应90度顺时针旋转 EndSection Section "Device" Identifier "MIPI-DSI" Driver "modesetting" EndSection
- 启动应用:
startx python3 run.py
内容的提问来源于stack exchange,提问作者cepko84
相关产品推荐
相关产品推荐

