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是透明色而已)