PySide2 Blur эффект для centralwidget, без наследования эффекта потомками
В классе главного окна накидываю эффект блюра на centralwidget, который имеет color: transparent; (основной виджет приложения, с кучей вложенных потомков). Делаю следующее
self.blur = QtWidgets.QGraphicsBlurEffect(self)
self.blur.setBlurRadius(50)
self.ui.centralwidget.setGraphicsEffect(self.blur)
Но эффект применяется ко всем элементам интерфейса = ко всем потомкам.
Есть ли варианты добавления блюр-эффекта фона приложения, без затрагивания элементов приложения? Может какая-то надстройка в stylesheets?
(Из того что я знаю, можно было бы взять белый цвет фона, и сделать его полупрозрачным, но это накидывает сразу белый фильтр на фон приложения, а надо чтобы цвета рабочего стола под приложением не менялись, только размывались)
Ответы (1 шт):
Попробуй под centralwidget вставить другой Qwidget, а на него уже наложить BlurEffect
from PyQt5 import QtCore, QtWidgets
import sys
class Example(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.setWindowFlags(QtCore.Qt.FramelessWindowHint |
QtCore.Qt.WindowStaysOnTopHint)
self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
self.frame = QtWidgets.QFrame(self)
self.frame.setGeometry(0, 20, 500, 500)
self.frame.setStyleSheet("background-color: rgba(125, 125, 255, 150)")
# Чтобы self.frame был по зади self.centralwidget нужно его инициализировать раньше
self.centralwidget = QtWidgets.QWidget(self)
self.centralwidget.resize(500, 500)
self.centralwidget.setStyleSheet("")
self.btn_close = QtWidgets.QPushButton(self.centralwidget)
self.btn_close.setGeometry(200, 200, 100, 100)
self.btn_close.clicked.connect(lambda: self.close())
self.btn_close.setText("Click me!")
blur = QtWidgets.QGraphicsBlurEffect()
blur.setBlurRadius(50)
self.frame.setGraphicsEffect(blur)
self.setCentralWidget(self.centralwidget)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
ui = Example()
ui.resize(500, 500)
ui.show()
exit(app.exec_())