MacOS下Python置顶窗口脚本全屏模式异常问题求助
问题解决:MacOS下PyQt6置顶窗口兼容全屏应用
问题分析
MacOS的全屏应用运行在独立的Space(桌面空间)中,普通Qt窗口默认会触发Space切换,导致全屏应用退出;同时WindowStaysOnTopHint仅能在当前Space内置顶,无法跨全屏应用所在的Space显示。
解决方案
通过组合Qt窗口标志和Mac特有的属性,让窗口成为不触发Space切换的工具窗口,同时保持跨全屏应用的置顶层级:
- 使用
Tool窗口标志,标记窗口为工具类窗口,Mac下这类窗口不会触发Space切换 - 启用
WA_MacAlwaysShowToolWindow属性,强制工具窗口在全屏应用上方显示 - 启用
WA_ShowWithoutActivating属性,显示窗口时不抢占焦点,避免全屏应用退出 - 可选添加
FramelessWindowHint,去掉窗口边框,更适合悬浮GIF场景
修改后的代码
import sys import os import time from PyQt6 import QtWidgets, QtGui, QtCore class LoadingGif(QtWidgets.QWidget): def __init__(self): super().__init__() self.setGeometry(0, 0, 200, 200) base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__))) imagePath = os.path.join(base_path, "earth.gif") self.movie = QtGui.QMovie(imagePath) self.movie.setScaledSize(QtCore.QSize(200, 200)) self.label = QtWidgets.QLabel(self) self.label.setGeometry(QtCore.QRect(0, 0, 200, 200)) self.label.setMovie(self.movie) self.label.mousePressEvent = self.CloseWindow self.movie.start() # 组合窗口标志 self.setWindowFlags( QtCore.Qt.WindowType.WindowStaysOnTopHint | QtCore.Qt.WindowType.Tool | QtCore.Qt.WindowType.FramelessWindowHint # 可选,去掉边框 ) # Mac特有属性设置 self.setAttribute(QtCore.Qt.WidgetAttribute.WA_MacAlwaysShowToolWindow, True) # 显示时不激活窗口,避免抢焦点 self.setAttribute(QtCore.Qt.WidgetAttribute.WA_ShowWithoutActivating, True) def CloseWindow(self, event): sys.exit() if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) time.sleep(5) window = LoadingGif() window.show() sys.exit(app.exec())
补充说明
- 如果需要保留窗口边框,移除
FramelessWindowHint标志即可 WA_MacAlwaysShowToolWindow是MacOS专属属性,仅在该系统下生效,不影响Windows平台的原有功能- 测试时确保MacOS系统设置中没有限制应用的窗口控制权限
内容的提问来源于stack exchange,提问作者Archie
相关产品推荐
相关产品推荐

