Ubuntu 20.04系统下PyQt5应用启动时意外进入全屏模式如何解决
PyQt5应用在Ubuntu 20.04自动进入全屏问题解决方案
问题根因
Ubuntu 20.04 默认搭载的 GNOME 桌面环境自带窗口自动调整策略:当应用窗口初始尺寸接近或超出桌面可用工作区(扣除顶部状态栏、侧边启动器后的区域),且初始位置落在左上角触发区域时,会被系统强制判定为需要最大化/全屏显示,若手动调整窗口位置的代码执行时机早于系统窗口管理器的接管逻辑,调整操作会被直接覆盖导致不生效。
可行解决方案
方案1:显式指定窗口标志与初始状态(推荐,应用级适配无需修改系统设置)
在主窗口初始化阶段、调用show()方法前,执行以下代码:
from PyQt5.QtCore import Qt from PyQt5.QtGui import QGuiApplication # 1. 自定义窗口标志,禁止窗口管理器无授权调整窗口属性 self.setWindowFlags( Qt.Window | Qt.CustomizeWindowHint | Qt.WindowTitleHint | Qt.WindowMinMaxButtonsHint | Qt.WindowCloseButtonHint ) # 2. 获取当前屏幕可用工作区尺寸,计算居中位置避免触发左上角规则 screen_available = QGuiApplication.primaryScreen().availableGeometry() window_w = 1830 window_h = 900 # 计算居中坐标,若屏幕尺寸小于窗口尺寸则默认从左上角偏移20px避开触发区 x = max(20, (screen_available.width() - window_w) // 2) y = max(20, (screen_available.height() - window_h) // 2) # 3. 先设置位置再调整尺寸,最后强制指定窗口非最大化/全屏状态 self.move(x, y) self.resize(window_w, window_h) self.setWindowState(Qt.WindowNoState)
方案2:延迟强制重置窗口状态
如果方案1仍被系统策略覆盖,可在窗口显示后延迟一小段时间强制重置窗口状态,规避系统策略的执行时间窗口:
from PyQt5.QtCore import QTimer # 放在主窗口初始化的最后,show()方法调用之后 QTimer.singleShot(100, lambda: self.setWindowState(Qt.WindowNoState))
方案3:系统级关闭自动最大化策略(可选)
如果需要彻底关闭该触发逻辑,可打开系统「设置」-「外观」,关闭自动最大化窗口选项即可。
注意事项
- 不要在
resizeEvent、moveEvent这类频繁触发的事件回调中重复设置窗口位置/大小,会和窗口管理器形成调整循环,反而加重异常。 - 如果你的屏幕物理分辨率小于1830x900,窗口最小尺寸超过了系统可显示范围,GNOME会强制缩放/全屏窗口,这种情况建议适当下调窗口最小尺寸适配屏幕。
内容的提问来源于stack exchange,提问作者vajra78
相关产品推荐
相关产品推荐

