如何更改 PyQt5 的不透明度 window

How to change the opacity of a PyQt5 window

我刚刚在 PyQt5 中试验了一些动画,希望为 window 的不透明度设置动画。我已经成功地在 window 内对按钮和 QWidget 的不透明度进行动画处理,但是当我尝试将相同的概念应用于主 QWidget class 时,它似乎不起作用。下面是我试图让动画在 window 上工作的代码(我知道这不是最好看的代码,但我只是想尝试一下,但也可以随时告诉我任何大的与问题无关的错误以及我对 PyQt5 也很陌生):

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys

class Test(QWidget):
    def __init__(self):
        super().__init__()

        self.setStyleSheet("background: green")
        self.setGeometry(100, 100, 400, 400)
        
        self.b = QPushButton("Reduce", self, clicked=self.reduce)
        self.b.show()
        self.b.setStyleSheet("color: yellow")
        
        self.show()

    def reduce(self):
        self.eff = QGraphicsOpacityEffect(self)
        self.eff.setOpacity(1)
        self.setGraphicsEffect(self.eff)

        self.anim = QPropertyAnimation(self.eff, b"opacity")
        self.anim.setDuration(500)
        self.anim.setStartValue(1)
        self.anim.setEndValue(0)
        self.anim.start()
        self.t = QTimer()
        self.t.timeout.connect(self.loop)
        self.t.start(10)
        print(self.eff.opacity())

    def loop(self):
        self.update()
        print(self.eff.opacity())
        if self.anim.currentValue() == 0:
            self.t.stop()
            self.update()

if __name__ == "__main__":
    window = QApplication(sys.argv)
    app = Test()
    window.exec_()

我想也许我得到了奇怪的结果,因为当小部件成为 window 中的主要小部件时不可能这样做,但是我也不明白为什么会这样成为一件事。对我来说似乎发生的是 window 什么都不做,什么也没有改变,除了按钮似乎半冻结,因为我可以点击它并得到一个结果(运行 它的功能也已连接)但是没有像往常一样出现按下动画。但是,当我调整 window 的大小时,它会显示一个变化,但这必须是手动的,因为我添加了一个基本循环来不断调整大小,但它什么也没做。最后,当我调整 window 的大小时,或者仅通过更改 self.eff 的不透明度来更改不透明度时,它会发生变化,但即使值为 0.8 等,它也会使它全黑,这就是导致我的原因相信这是不可能的,并且某些脚本将其默认为黑色,因为该按钮可以正常工作,而其余按钮则变黑。感谢任何帮助。

这样试试:

import sys
from PyQt5.Qt import *


class Test(QWidget):
    def __init__(self):
        super().__init__()
        self.setStyleSheet("background: green;")
        self.resize(400, 400)
        
        self.label = QLabel()
        self.pixmap = QPixmap('Ok.png')
        self.label.setPixmap(self.pixmap)
        self.label.setAlignment(Qt.AlignCenter)
        self.label.setStyleSheet("background: #CD113B;")
        
        self.b = QPushButton("Reduce", self, clicked=self.reduce)
        self.b.setStyleSheet("background: blue; color: yellow;")
        
        layout = QVBoxLayout(self)
        layout.addWidget(self.label)
        layout.addWidget(self.b)

    def reduce(self):
        self.anim = QPropertyAnimation(self, b"opacity")
        self.anim.setDuration(3000)        
        self.anim.setLoopCount(3)
        self.anim.setStartValue(0.0)
        self.anim.setEndValue(1.0)        
        self.anim.start()
            
    def windowOpacity(self):
        return super().windowOpacity()    
    
    def setWindowOpacity(self, opacity):
        super().setWindowOpacity(opacity)    
    
    opacity = pyqtProperty(float, windowOpacity, setWindowOpacity)    
    

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = Test()
    w.show()
    sys.exit(app.exec_())



左右:

import sys
from PyQt5.Qt import *


class Test(QWidget):
    def __init__(self):
        super().__init__()
        self.setStyleSheet("background: green;")
        self.resize(400, 400)
        
        self.label = QLabel()
        self.pixmap = QPixmap('Ok.png')
        self.label.setPixmap(self.pixmap)
        self.label.setAlignment(Qt.AlignCenter)
        self.label.setStyleSheet("background: #CD113B;")
        
        self.b = QPushButton("Reduce", self, clicked=self.reduce)
        self.b.setStyleSheet("background: blue; color: yellow;")
        
        layout = QVBoxLayout(self)
        layout.addWidget(self.label)
        layout.addWidget(self.b)

    def reduce(self):
        self.eff = QGraphicsOpacityEffect()
        self.eff.setOpacity(1.0)        
        self.label.setGraphicsEffect(self.eff)
        
        self.anim = QPropertyAnimation(self.eff, b"opacity")
        self.anim.setDuration(3000)        
        self.anim.setLoopCount(3)
        self.anim.setStartValue(0.0)
        self.anim.setEndValue(1.0)        
        self.anim.start()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = Test()
    w.show()
    sys.exit(app.exec_())


Ok.png