QPropertyAnimation для прозрачности виджета перезапускается при изменении размера, в результате чего окно мигает / мерцает - PullRequest
0 голосов
/ 05 июня 2019

У меня есть следующий код:

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

Работает нормально (эффект исчезает). Однако, когда я изменяю размер окна, анимация перезапускается, заставляя окно мигать / мерцать во время изменения размера. Если я уберу вызов animate после вызова, чтобы показать, больше не будет мигать (но не исчезнет).

Более того, через некоторое время изменение размера на гораздо больший приводит к отображению белого прямоугольника на черном фоне.

Что-то мне не хватает?


UPDATE

Это поведение, которое я ищу (фон остается белым, т.е. непрозрачность = 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_())
...