Python 我可以模糊qwidget“;菜单位置”;?

Python 我可以模糊qwidget“;菜单位置”;?,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我需要使“菜单位置”块的背景半透明,并模糊背面的所有内容。并保持文本清晰。这种效果通常称为磨砂玻璃效果 但不幸的是,我只能模糊整个小部件 import sys from PyQt5.QtCore import (QCoreApplication, QMetaObject, QObject, QPoint, QRect, QSize, QUrl, Qt) from PyQt5 import QtWidgets from PyQt5 import QtGui from PyQt5 im

我需要使“菜单位置”块的背景半透明,并模糊背面的所有内容。并保持文本清晰。这种效果通常称为磨砂玻璃效果

但不幸的是,我只能模糊整个小部件

import sys


from PyQt5.QtCore import (QCoreApplication, QMetaObject, QObject, QPoint,
    QRect, QSize, QUrl, Qt)
from PyQt5 import QtWidgets
from PyQt5 import QtGui
from PyQt5 import QtCore
from PyQt5.QtCore import QPropertyAnimation, QPoint

from PyQt5.QtWidgets import QGraphicsEffect

#Or

'''
from PySide2.QtCore import (QCoreApplication, QMetaObject, QObject, QPoint,
    QRect, QSize, QUrl, Qt)
from PySide2 import QtWidgets
from PySide2 import QtGui
from PySide2 import QtCore
from PySide2.QtCore import QPropertyAnimation, QPoint

from PySide2.QtWidgets import QGraphicsEffect
'''



class test_mynu(QtWidgets.QWidget):
    def __init__(self, arr="", parent=None):
        super(test_mynu, self).__init__(parent)
        self._expand = False                                # - self.__expand ; + self._expand  !!!
        #------menu_pos_block------
        self.menu_pos_block = QtWidgets.QWidget()

        blur = QtWidgets.QGraphicsBlurEffect(blurRadius=5)
        self.menu_pos_block.setGraphicsEffect(blur)


        #------menu_pos_block_layout------
        self.menu_pos_block_layout = QtWidgets.QHBoxLayout(self.menu_pos_block)
        self.menu_pos_block_layout.setObjectName(u"menu_pos_block_layout")
        #------menu_pos_label------
        self.menu_pos_label = QtWidgets.QLabel()
        self.menu_pos_label.setText(arr)
        self.menu_pos_block_layout.addWidget(self.menu_pos_label)
        #------ADD------
        lay = QtWidgets.QHBoxLayout(self)
        lay.addWidget(self.menu_pos_block)



class MainWindow(QtWidgets.QMainWindow):
    # number of radio
    def num(self):
        return 3
    def __init__(self, parent=None):
        super().__init__(parent)

        self.toggle_animations = QtCore.QSequentialAnimationGroup(self)

        #------centralwidget------
        centralwidget = QtWidgets.QWidget()
        centralwidget.setObjectName(u"centralwidget")
        self.setCentralWidget(centralwidget)
        #------layout------
        central_w_layout = QtWidgets.QGridLayout(centralwidget)
        central_w_layout.setObjectName(u"central_w_layout")
        #------Spacer------
        vs_up = QtWidgets.QSpacerItem(17, 105, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        central_w_layout.addItem(vs_up, 0, 1, 1, 1)
        hs_left = QtWidgets.QSpacerItem(327, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        central_w_layout.addItem(hs_left, 1, 0, 1, 1)
        hs_right = QtWidgets.QSpacerItem(326, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        central_w_layout.addItem(hs_right, 1, 2, 1, 1)
        vs_down = QtWidgets.QSpacerItem(20, 105, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        central_w_layout.addItem(vs_down, 2, 1, 1, 1)
        #------block------
        block = QtWidgets.QWidget()
        block.setObjectName(u"block")
        central_w_layout.addWidget(block, 1, 1, 1, 1)             ######
        #------layout------
        layout_block = QtWidgets.QVBoxLayout(block)
        layout_block.setObjectName(u"layout_block")
        #------menu_block------
        menu_block = QtWidgets.QWidget()
        menu_block.setObjectName(u"menu_block")
        layout_block.addWidget(menu_block)             ######
        #------menu_layout------
        menu_layout = QtWidgets.QHBoxLayout(menu_block)
        menu_layout.setObjectName(u"menu_layout")

        self.menu_but = []
        self.menu_pos = []
        self.menu_by_pos = None

        for i in range(self.num()):
            menu_pos_block = test_mynu("menu_{}".format(i))
            menu_pos_block.setObjectName("menu_pos_{}".format(i))

            self.menu_pos.append(menu_pos_block)
            self.menu_pos[i].setGeometry(QRect(menu_pos_block.width(), menu_pos_block.height(), 151, 181))
            menu_layout.addWidget(self.menu_pos[i])

        #------menu_block_but------
        self.menu_block_but = QtWidgets.QWidget()
        self.menu_block_but.setObjectName(u"menu_block_but")
        menu_layout.addWidget(self.menu_block_but)             ######
        #------menu_block_but_layout------
        menu_block_but_layout = QtWidgets.QVBoxLayout(self.menu_block_but)
        menu_block_but_layout.setObjectName(u"menu_block_but_layout")
        #------menu_but_radio------
        for i in range(self.num()):
            menu_but_radio = QtWidgets.QRadioButton('{}'.format(i))
            menu_but_radio.setObjectName("{}".format(i))
            menu_but_radio.toggled.connect(self.menu_animation)

            self.menu_but.append(menu_but_radio)
            menu_block_but_layout.addWidget(menu_but_radio)

        # Связывание меню к кнопкам и наоборот
        self.menu_by_but = dict()
        self.but_by_menu = dict()
        for i in range(self.num()):
            but = self.menu_but[i]
            menu = self.menu_pos[i]

            self.menu_by_but[menu] = but
            self.but_by_menu[but] = menu

        menu_block_content = QtWidgets.QWidget()
        menu_block_content.setObjectName(u"menu_block_content")
        menu_layout.addWidget(menu_block_content)             ######
        #------menu_content_layout------
        menu_content_layout = QtWidgets.QHBoxLayout(menu_block_content)
        menu_content_layout.setObjectName(u"menu_content_layout")
        #------menu_label------
        menu_label = QtWidgets.QLabel()
        menu_label.setText('text, text text, text')
        menu_content_layout.addWidget(menu_label)

        self.num = 0
        self.menu_pos_ter = []

    def menu_animation(self):
        self.num =self.num+1
        self.toggle_animations.clear()

        num = int(self.sender().objectName())
        self.menu_pos_ter.append(self.menu_pos[num])

        # Хитрая сортировка, что сначала вернет элемент с _expand = True
        for menu in sorted(self.menu_pos_ter, key=lambda x: x._expand):
            pos1 = QPoint(self.menu_block_but.x() - menu.width(), menu.y())
            pos2 = QPoint(self.menu_block_but.x() +self.menu_block_but.width(), menu.y())

            but = self.menu_by_but[menu]
            menu.raise_()
            self.menu_block_but.raise_()
            if but.isChecked():

                start_pos = pos1
                end_pos = pos2
            else:
                start_pos = menu.pos()
                end_pos = pos1

            anim = QPropertyAnimation(menu, b"pos")
            anim.setDuration(1000)
            anim.setStartValue(start_pos)
            anim.setEndValue(end_pos)

            self.toggle_animations.addAnimation(anim)


        if (self.num == 1) or (self.num == 3):
            self.toggle_animations.start()
            self.menu_pos_ter.clear()

        if self.num == 3 :
            self.num = 1
        print("--x--")


StyleSheet = """
#centralwidget QWidget QWidget,
#centralwidget QWidget QWidget QWidget QWidget,
#centralwidget QWidget QWidget QWidget QWidget QWidget QWidget,
#centralwidget QWidget QWidget QWidget QWidget QWidget QWidget QWidget QWidget,
#centralwidget QWidget QWidget QWidget QWidget QWidget QWidget QWidget QWidget QWidget QWidget{
background:#000;
color:#fff;
}
#centralwidget QWidget,
#centralwidget QWidget QWidget QWidget,
#centralwidget QWidget QWidget QWidget QWidget QWidget,
#centralwidget QWidget QWidget QWidget QWidget QWidget QWidget QWidget,
#centralwidget QWidget QWidget QWidget QWidget QWidget QWidget QWidget QWidget QWidget{
background:#fff;
color:#000;
}
#click_me{
background:#000;
color:#fff;
}
"""

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    app.setStyleSheet(StyleSheet)
    w = MainWindow()
    w.resize(640, 570) #Size window
    w.show()
    sys.exit(app.exec_())

我希望小部件看起来像这个html模板

$(“.menu btn input”).change(函数(){
$('.menu_1').removeClass('menu_1_active');
$('.menu_2').removeClass('menu_2_active');$('.menu_3').removeClass('menu_3_active');
$('.sidebar\u menu\u 1').removeClass('sidebar\u menu\u 1'u active');
$('.frame_menu_1').removeClass('frame_menu_1_active');
$('.sidebar\u menu\u 2').removeClass('sidebar\u menu\u active');
$('.frame_menu_2').removeClass('frame_menu_2_active');
$('.sidebar\u menu\u 3').removeClass('sidebar\u menu\u 3\u active');
$('.frame_menu_3').removeClass('frame_menu_3_active');
var name=$(this.val();
setTimeout(函数(){
$('.menu'+name).toggleClass('menu'+name+'u active');
$('.sidebar_menu_'+name).toggleClass('sidebar_menu_'+name+'u active');
$('.frame_menu_'+name).toggleClass('frame_menu_'+name+'u active');
}, 1000);
});
/*返回*/
$(“#块模糊”)。附加(“”);
$(“#块模糊”)。附加(“”);
$(“#块模糊”)。附加(“”);
/*复制菜单*/
$('.copy').clone().appendTo('.full')
.content>h3{
填充:10px;
保证金:2倍;
}
.标题1{
背景:红色;
}
.标题2{
背景:蓝色;
}
.标题3{
背景:绿色;
}
.标题4{
背景:url('https://i.ytimg.com/vi/slZdLNewXrE/maxresdefault.jpg');
}
.标题5{
背景:黄色;
}
.菜单btn{
显示器:flex;
弯曲方向:立柱;
背景色:#333;
位置:绝对位置;
左:10px;
顶部:10px;
z指数:110;
}
.菜单btn>输入{
保证金:2倍;
}
.菜单>分区{
宽度:200px;
高度:200px;
背景色:#18182178;
位置:绝对位置;
左:0px;
顶部:0px;
文本对齐:居中;
颜色:白色;
过渡:1s;
转化:translateX(-100%);
z指数:100;
}
.menu.menu\u 1\u激活,
.menu.menu_2_激活,
.菜单.菜单3\u激活{
转化:translateX(0%);
}
/*模糊*/
.frame_菜单_1,
.框架菜单2,
.框架菜单3{
z指数:10;
溢出:隐藏;
位置:绝对位置;
宽度:200px!重要;
高度:200px!重要;
顶部:200px!重要;
左:0px!重要;
过渡:1s;
转换:翻译(0%,-100%);
转换:转换(-100%,-100%);
}
.frame\u菜单\u 1\u处于活动状态,
.frame_菜单_2_处于活动状态,
.frame\u菜单\u 3\u激活{
过渡:1s;
转换:转换(-100%,-100%);
转换:翻译(0%,-100%);
}   
/*抄袭*/
.侧边栏菜单1,
.侧边栏菜单2,
.侧边栏菜单3{
宽度:100%!重要;
身高:100%!重要;
位置:绝对位置;
过滤器:模糊(8px);
-webkit过滤器:模糊(8px);
顶部:-200px;
左:0px;
过渡:1s;
转换:翻译(0%,100%);
转换:翻译(100%,100%);
}
/*活跃的*/
.侧边栏菜单1处于活动状态,
.侧边栏菜单2处于活动状态,
.侧边栏\u菜单\u 3\u激活{
过渡:1s;
转换:翻译(100%,100%);
转换:翻译(0%,100%);
}

菜单1
菜单2
菜单3
文本文本文本
文本文本文本
文本文本文本
文本文本文本
文本文本文本

QGraphicsEffect会影响小部件及其子部件,因此QLabel也会受到影响。为了避免这种情况,一种可能的解决方案是使用一个QWidget,其中通过布局建立了另一个QWidget,并对该最后一个小部件应用该效果,并向初始QWidget添加一个QLabel,以便QLabel和QWidget将有效地具有相同的父级,还必须使用raise_3;(),以便QLabel位于所有内容之上:

从PyQt5导入QtCore、QtGui、qtwidget
类标签(qtwidts.QWidget):
def uuu init uuu(self,text,parent=None):
super()。\uuuu init\uuuu(父级)
self.setAttribute(QtCore.Qt.WA_StyledBackground)
widget=qtwidts.QWidget()
setStyleSheet(““QWidget{background:#fff;color:#000;}”)
模糊效果=qtwidts.qgraphicsblueffect(模糊半径=5)
widget.setGraphicsEffect(模糊效果)
self.\u label=qtwidts.QLabel(
text=text,alignment=QtCore.Qt.AlignCenter,parent=self
)
self.label.setStyleSheet(“背景色:透明;颜色:黑色”)
self.label.setContentsMargins(10,0,10,0)
lay=qtwidts.QVBoxLayout(self)
lay.addWidget(小部件)
@财产
def标签(自我):
返回自我。\u标签
def sizeHint(自身):
返回self.\u label.sizeHint()
def resizeEvent(自我,事件):
self.\u label.resize(self.size())
self.\u label.raise\u()
return super().resizeEvent(事件)
类ButtonWidget(QtWidgets.QWidget):
单击=QtCore.pyqtSignal(int)
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.setAttribute(QtCore.Qt.WA_StyledBackground)
self.setStyleSheet(““”背景:#fff;“””)
vlay=qtwidts.QVBoxLayout(self)
group=qtwidts.QButtonGroup(self)
group.buttonClicked[int].连接(自.单击)
对于范围(3)中的i:
radiobutton=qtwidts.QRadioButton(str(i))
radiobutton.setStyleSheet(“背景:#000;颜色:#fff;”)
组添加按钮(radiobutton,i)
vlay.addWidget(单选按钮)
类LabelWidget(QtWidgets.QWidget):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.setAttribute(QtCore.Qt.WA_StyledBackground)
self.setStyleSheet(““”背景:#fff;“””)
vlay=qtwidts.QVBoxLayout(self)
label=QtWidgets.QLabel(“文本,文本,文本,文本”)
label.setStyleSheet(““”背景:#000;颜色:#fff;“””)
vlay.addWidget(标签)
类MainWindow(QtWidgets.QMainWindow):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
container=qtwidts.QWidget()
container.setStyleSheet(““”QWidget{background