You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无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平台传递旋转参数,无需修改代码,同时配置触摸坐标对应旋转:

  1. 启动应用时添加旋转参数:
QT_QPA_PLATFORM=linuxfb:rotation=90 python3 run.py
  1. 配置触摸坐标旋转:创建/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管理屏幕旋转,应用无需修改:

  1. 安装必要组件:
sudo apt install xorg xserver-xorg-core xinit
  1. 创建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
  1. 启动应用:
startx python3 run.py

内容的提问来源于stack exchange,提问作者cepko84

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 05:47:19