PyQt5中QSlider覆盖QLabel时透明效果显示异常问题求助
PyQt5 QSlider叠放QLabel透明显示异常解决方案
该问题核心原因是QSlider默认会绘制继承自父控件的背景填充层,仅单独设置groove透明或者控件属性无法完全关闭背景绘制,会遮挡下层叠放的QLabel内容。
可通过以下两步修改解决:
- 为QSlider添加两个属性,关闭系统自带的背景绘制逻辑:
self.slider.setAttribute(Qt.WA_TranslucentBackground) self.slider.setAttribute(Qt.WA_NoSystemBackground)
- 在QSlider的样式表中补充全局透明规则,同时明确设置groove的背景为透明,给滑块把手单独设置可见的背景色:
QSlider { background: transparent; } QSlider::groove:vertical { background: transparent; border-radius:4px; border:1px solid #88888f; } QSlider::handle:vertical { background: #d8d8df; border-radius:4px; margin:-5px 0px; border:1px solid #88888f; }
修改后的完整最小可运行代码如下:
from PIL import Image, ImageQt from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QSlider, QStyleFactory from PyQt5.QtGui import QPixmap from PyQt5.QtCore import Qt import sys class Interface(QMainWindow): def __init__(self): super(Interface, self).__init__() self.setWindowTitle('slider test') self.setStyleSheet('background-color: #d8d8df;') self.background = Image.new('RGBA', (40, 256), (255, 0, 0, 255)) self.label = QLabel(self) self.backgroundQt = ImageQt.ImageQt(self.background) self.backgroundPixmap = QPixmap.fromImage(self.backgroundQt) self.label.setPixmap(self.backgroundPixmap) self.label.setGeometry(100, 100, 40, 256) self.slider = QSlider(Qt.Vertical, self) self.slider.setStyle(QStyleFactory.create('fusion')) # 新增两个属性关闭系统背景绘制 self.slider.setAttribute(Qt.WA_TranslucentBackground) self.slider.setAttribute(Qt.WA_NoSystemBackground) # 补充完整样式表 self.slider.setStyleSheet(''' QSlider { background: transparent; } QSlider::groove:vertical { background: transparent; border-radius:4px; border:1px solid #88888f; } QSlider::handle:vertical { background: #d8d8df; border-radius:4px; margin:-5px 0px; border:1px solid #88888f; } ''') self.slider.setGeometry(100, 100, 40, 256) self.showMaximized() if __name__ == '__main__': app = QApplication(sys.argv) app.setStyle('fusion') ex = Interface() sys.exit(app.exec_())
修改后运行即可看到下层红色QLabel内容正常透过滑块的透明区域显示,滑块交互功能完全正常,不需要将渐变保存为本地文件,直接内存生成的QPixmap可以正常使用。
内容的提问来源于stack exchange,提问作者mazelover1939
相关产品推荐
相关产品推荐

