小部件不透明度上的QPropertyAnimation在调整大小时重新启动,导致窗口闪烁/闪烁

时间:2019-06-05 20:57:34

标签: python pyqt pyqt5 qpropertyanimation

我的代码如下:

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_())

它工作正常(淡入淡出)。但是,当我调整窗口大小时,动画会重新启动,从而导致窗口在调整大小时闪烁/闪烁。如果我在通话显示后删除通话进行动画处理,则不再眨眼(但不再淡入)。

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

有什么我想念的吗?


更新

这是我要寻找的行为(动画运行一次后背景保持白色,即opacity = 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_())

0 个答案:

没有答案