0

我有这个代码如下:

import sys

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


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

    w    = QWidget()
    eff  = QGraphicsOpacityEffect(w)
    anim = QPropertyAnimation(eff, b"opacity")
    btn  = QPushButton("Button", w)
    btn.clicked.connect(w.close)

    eff.setOpacity(0)
    w.setAutoFillBackground(True)
    w.setGraphicsEffect(eff)
    w.show()

    anim.setDuration(10000)
    anim.setStartValue(0)
    anim.setEndValue(1)
    anim.start()

    sys.exit(app.exec_())

它工作正常(淡入效果)。但是,当我调整窗口大小时,动画会重新启动,导致窗口在调整大小期间闪烁/闪烁。如果我在调用显示后删除了对动画的调用,则不再闪烁(但不再淡入)。

此外,一段时间后,调整到更大的尺寸会导致显示黑色背景上的白色矩形。

有什么我想念的吗?


更新

这是我正在寻找的行为(在动画运行一次后背景保持白色,即不透明度=1)。使用以下代码,但看起来不像是这样做的最佳实践。

import sys, time

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


class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.w = QWidget()
        self.w.setMinimumSize(400,400)
        self.w.resizeEvent = self.selfOnResize # added this

    def animate(self):
        self.eff  = QGraphicsOpacityEffect(self.w)
        self.anim = QPropertyAnimation(self.eff, b"opacity")
        self.btn  = QPushButton("Button", self.w)
        self.btn.clicked.connect(self.w.close)

        self.eff.setOpacity(0)
        self.w.setAutoFillBackground(True)
        self.w.setGraphicsEffect(self.eff)
        self.w.show()

        self.anim.setDuration(100000)
        self.anim.setStartValue(0)
        self.anim.setEndValue(1)
        self.anim.start()

    # this fixes the issue but looks like a dirty hack
    def selfOnResize(self, event):
        self.eff.setOpacity(1) 
        # print(event)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MyWidget()
    w.animate()
    sys.exit(app.exec_())
4

0 回答 0