pyqt5中QWidget窗口透明色黑色解决办法,及窗口置桌面下方

python3.8.1-win32

pyqt5.14.2

发现个问题setAttribute(Qt.WA_TranslucentBackground)窗口背景黑了,

若是隐藏标题栏,再设置透明色,依然如此。

还有种情况:有标题栏,背景却透明。难道二者不可兼得?

毕设中遇到窗口Qwidget设置setAttribute(Qt.WA_TranslucentBackground)背景为黑,用styesheet也不中,所以借助user32.dll来达到目的尤其是有FigueCanvas在场,如果设置Qwidget透明了,但是figue

from matplotlib.figure import Figure

这玩意却无法透明,设置颜色为none竟然给我显示白色。

打住,让我们谈谈解决方案

以控件的  int(Qwidget.winId())拿到窗口句柄,记得强转,然后用user32.dll进行加特技。

下面的代码原本是易语言的鼠标穿透与颜色透明代码,后来改了,没删减,tkinter可以用

    def hidewidget(self,hwnd):
        self.user32 = ctypes.windll.LoadLibrary('user32.dll')
        #cs = self.user32.GetWindowLongA(hwnd, -20)
        #cs = (cs | 32) | 524288
        self.user32.SetWindowLongA(hwnd, -20, 524288)  # 鼠标穿透(放弃)
        cs2 = (240 + 240 * 256 + 240 * 256 * 256)  # RGB:#f0f0f0
        self.user32.SetLayeredWindowAttributes(hwnd, cs2, 255, 1)  # (窗口句柄,透明色,透明度,fuc代码)

这样就能设置控件的透明色了,然后也不需要

self.setWindowFlags(Qt.FramelessWindowHint | Qt.Tool)

来隐藏标题栏,你可以

setGeometry(-1, -1, 1921, 1080)来全屏且无边框

当设置为-1时,顶部的标题栏就没了,正好我用的上,宽度1921是因为屏幕右边有一列白色条条,一看就知道宽度不到位,所以宽度就1921了,估计底部也有白色条条,不过我看不到,不管了。

这就是我的figuecanvas跟Qwidget窗口的写法

class MyMplCanvas(FigureCanvas):
    def __init__(self, parent=None):
        self.fig = Figure(figsize=(8 , 8), dpi=100, facecolor='#f0f0f0')  # facecolor 背景色f0f0f0
        self.ax = self.fig.gca(projection='polar')
        self.ax.set_axis_off()
        self.ln, = self.ax.plot([], [])
        FigureCanvas.__init__(self, self.fig)
        self.setParent(parent)
class FlyQwidget(QWidget):
    media_finished = pyqtSignal()
    def __init__(self):#不用parent,所以不写
        super().__init__()
        self.fullsite = None
        self.setObjectName('FlyQwidget')

        self.canvas = MyMplCanvas()
        self.ver = QVBoxLayout(self)
        self.ver.setContentsMargins(0,0,0,0)
        self.ver.addWidget(self.canvas)

        self.setWindowFlags(Qt.WindowStaysOnTopHint)
        #self.setWindowFlags(Qt.FramelessWindowHint | Qt.Tool)  # 无title
        #self.setWindowFlags(Qt.NoDropShadowWindowHint | Qt.Dialog)
        #self.setAttribute(Qt.WA_NoSystemBackground)
        #self.setAttribute(Qt.WA_TranslucentBackground)  # 透明
        self.setWindowTitle("dance")
        self.setGeometry(-1, -1, 1921, 1080)
        self.init_setting()
******省略号

然后是利用user32.dll使Qwidget放桌面下方,得,还是把工具类分享出来吧。这特酿得是干货,用到及赚到。

这代码也是我搬易语言精易模块得,我都把自己写蒙了。

class desk_bottom(object):
    def __init__(self):
        self.user32 = ctypes.windll.LoadLibrary('user32.dll')
        self.zmjb = win32gui.FindWindow("Progman", "Program Manager")
    def zmh(self,ckjb):
        self.lock = None
        self.ckjb = ckjb
        lpdwsult = 0
        self.user32.SendMessageTimeoutA(self.zmjb, 1324, 0, 0, 0, 1000, lpdwsult)
        print("000000000",self.ckjb, self.zmjb)
        retn = []
        win32gui.EnumWindows(self.cha, retn)  # 枚举窗口+干活
        ret = self.user32.SetParent(self.ckjb, self.zmjb)
        #print(ret)
    def cha(self,hwnd, lparam):
        if self.lock != None and self.lock:
            name = win32gui.GetClassName(hwnd)
            if name == 'WorkerW':
                rere = win32gui.FindWindowEx(hwnd, 0, u'SHELLDLL_DefView', None)
                if rere != 0:
                    self.lock = None
        elif self.lock == None:
            self.deskhwnd = hwnd
            self.user32.ShowWindowAsync(self.deskhwnd, False)
            self.lock = False
        elif self.lock == False:
            pass
    def hidewidget(self,hwnd):
        #cs = self.user32.GetWindowLongA(hwnd, -20)
        #cs = (cs | 32) | 524288
        self.user32.SetWindowLongA(hwnd, -20, 524288)  # 鼠标穿透
        cs2 = (240 + 240 * 256 + 240 * 256 * 256)  # RGB
        self.user32.SetLayeredWindowAttributes(hwnd, 15790320, 255, 1)  # (窗口句柄,透明色,透明度,fuc代码)

********

main里的代码
desk_tool = desk_bottom()
        desk_tool.zmh(int(dancewid.winId()))
        desk_tool.hidewidget(int(dancewid.winId()))

让我们康康效果,说出来你可能不信,有个Qwidget放桌面地下了,figuecanvas也透明了,(其实就是#f0f0f0是透明色而已)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值