如何设置QWindow实现鼠标等事件穿透,用作OBS流统计叠加层?
修复方案
原代码失效的核心原因是缺少高优先级的输入穿透窗口标志,且X11环境下绕过窗口管理器的配置被注释,以下是全平台可用的实现代码:
from PyQt5.QtWidgets import QApplication, QWidget, QLabel from PyQt5.QtCore import Qt from PyQt5.QtGui import QColor, QPalette app = QApplication([]) window = QWidget() # 核心窗口标志配置 window.setWindowFlags( Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint | Qt.X11BypassWindowManagerHint | Qt.WindowTransparentForInput # 强制输入穿透,Qt5.9+支持 | Qt.WindowDoesNotAcceptFocus # 禁止窗口抢夺输入焦点 ) # 窗口属性配置 window.setAttribute(Qt.WA_TransparentForMouseEvents, True) window.setAttribute(Qt.WA_TranslucentBackground, True) # 测试用:添加半透明文本验证叠加层显示正常 label = QLabel("OBS推流统计测试", window) palette = label.palette() palette.setColor(QPalette.WindowText, QColor(255, 255, 255)) label.setPalette(palette) label.setStyleSheet("font-size:24px;") label.adjustSize() window.resize(400, 100) window.show() app.exec()
关键配置说明
Qt.WindowTransparentForInput是Qt5.9版本新增的窗口标志,比WA_TransparentForMouseEvents属性优先级更高,对Windows、macOS、Linux X11平台的适配更稳定,能完全拦截所有输入事件到当前窗口- 不要注释
Qt.X11BypassWindowManagerHint参数,Linux环境下该参数会绕过窗口管理器的事件拦截,是实现穿透的必要条件,Windows和macOS平台会自动忽略该参数,无副作用 - 若叠加层添加了子控件,所有子控件也需要单独设置
Qt.WA_TransparentForMouseEvents属性,避免子控件触发鼠标事件拦截 - Windows平台下可额外添加
window.setAttribute(Qt.WA_NoChildEventsForParent, True),进一步避免子控件的事件冒泡
内容的提问来源于stack exchange,提问作者majkrzak
相关产品推荐
相关产品推荐

