PyQt5无边框透明点击穿透脚本在Ubuntu系统窗口不显示问题求助
问题原因
Qt.Tool窗口类型在X11协议(Ubuntu默认使用的显示服务协议,Wayland环境下也会通过Xwayland做兼容处理)下的表现和Windows存在平台差异:Ubuntu默认GNOME桌面的Mutter窗口管理器,默认不会渲染没有父控件的独立Tool类型窗口,避免无主工具面板异常占用任务栏/显示层级。- 你的代码同时叠加了
Qt.X11BypassWindowManagerHint标识,该标识会让窗口管理器跳过对该窗口的所有默认排版、渲染策略管控,和Qt.Tool标识共同作用时会直接导致窗口没有被分配可见的绘制层级,最终表现为窗口不显示、无报错。 - 额外的代码冗余问题:你先后两次调用
setWindowFlags,第二次的参数会直接覆盖第一次的设置,且代码中存在无意义的windows = QtWidgets.QWidget()声明,不会影响运行但属于冗余代码。
解决方法
你的需求(无边框、背景透明、鼠标穿透、窗口置顶)不需要依赖Qt.Tool标识即可实现,直接从窗口flag中移除该标识即可。如果必须保留Tool标识的其他特性,可额外创建一个隐藏的QWidget作为该窗口的父控件即可。
修改后的完整代码
import sys from PyQt5 import QtWidgets, QtCore from PyQt5.QtCore import Qt from PyQt5.QtGui import QPixmap, QIcon from PyQt5.QtWidgets import * class Window(QMainWindow): def __init__(self): super().__init__() self.acceptDrops() self.setWindowTitle("RGB Corners") # 创建图片展示标签 self.label = QLabel(self) self.pixmap = QPixmap('greenRGB.png') self.label.setPixmap(self.pixmap) # 标签自适应图片尺寸并居中 self.label.resize(self.pixmap.width(), self.pixmap.height()) self.label.setAlignment(QtCore.Qt.AlignCenter) # 移除Qt.Tool标识,保留所有必要功能标识 self.setWindowFlags(Qt.Window|Qt.X11BypassWindowManagerHint|Qt.WindowStaysOnTopHint|Qt.FramelessWindowHint) self.setAttribute(Qt.WA_TranslucentBackground) self.setAttribute(Qt.WA_TransparentForMouseEvents, True) self.setAttribute(Qt.WA_NoChildEventsForParent, True) # 先最大化再显示,避免窗口闪烁 self.showMaximized() self.show() if __name__ == '__main__': App = QApplication(sys.argv) window = Window() # 系统托盘逻辑 trayIcon = QSystemTrayIcon(QIcon('test.png'), parent=App) trayIcon.setToolTip('RGB Corners') trayIcon.show() trayMenu = QMenu() exitAction = trayMenu.addAction('Exit') exitAction.triggered.connect(App.quit) trayIcon.setContextMenu(trayMenu) sys.exit(App.exec())
其他注意事项
- 如果移除
Qt.Tool后出现窗口被其他界面遮挡的情况,可去掉Qt.X11BypassWindowManagerHint标识测试,部分窗口管理器下该标识会导致置顶策略失效。 - 运行前请确认
greenRGB.png和test.png文件在脚本运行的工作目录下,避免图片加载失败导致空白窗口。
内容的提问来源于stack exchange,提问作者Zany_Zachary1
相关产品推荐
相关产品推荐

