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

PyQt5无边框透明点击穿透脚本在Ubuntu系统窗口不显示问题求助

问题原因

  1. Qt.Tool 窗口类型在X11协议(Ubuntu默认使用的显示服务协议,Wayland环境下也会通过Xwayland做兼容处理)下的表现和Windows存在平台差异:Ubuntu默认GNOME桌面的Mutter窗口管理器,默认不会渲染没有父控件的独立Tool类型窗口,避免无主工具面板异常占用任务栏/显示层级。
  2. 你的代码同时叠加了Qt.X11BypassWindowManagerHint标识,该标识会让窗口管理器跳过对该窗口的所有默认排版、渲染策略管控,和Qt.Tool标识共同作用时会直接导致窗口没有被分配可见的绘制层级,最终表现为窗口不显示、无报错。
  3. 额外的代码冗余问题:你先后两次调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:27:05