QPropertyAnimation 不适用于 Window 不透明度

QPropertyAnimation not working with Window Opacity

我正在设置一个新的桌面小部件以使我的工作更轻松,并使用 QPropertyAnimation 使其更漂亮。淡入和淡出应用程序似乎并不想工作,并且以典型的编码器方式,它使我的进度停滞不前。

我在个性化 class 中实现 QPropertyAnimation 以使我的生活更轻松,但由于它最初没有工作,我已经将它带回 class 代码并且它仍然非常顽固.到目前为止我已经尝试过了。

class widget(QWidget):

def init(self):
   self.setSize(QSize(300, 300))
   self.setWindowOpacity(1)
   self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
   self.setAttribute(Qt.WA_TranslucentBackground)

def paintEvent(self, event):
   s = self.size()
   qp = QPainter()
   qp.begin(self)
   qp.setRenderHint(QPainter.Antialiasing, True)
   qp.setBrush(QColor().fromRgb(2,106,194))
   qp.setPen(QColor().fromRgb(2,106,194))
   qp.drawRoundRect(QRect(0,0, 300, 300), 16, 8)
   qp.end()

def show(self):
   self.superShow()
   a = QPropertyAnimation(self, "windowOpacity")
   a.setDuration(500)
   a.setStartValue(1)
   a.setEndValue(0)
   a.start()

def hide(self):
   a = QPropertyAnimation(self, "windowOpacity")
   a.setDuration(500)
   a.setStartValue(0)
   a.setEndValue(1)
   a.finished.connect(self.superHide)
   a.start()

def superShow(self):
   super(widget, self).show()

def superHide(self):
   super(widget, self).hide()

完全没有错误消息,它只是在动画持续时间结束后隐藏和显示。不知道去哪里看或做什么才能让它发挥作用。我只写了大约 3 个月左右的代码。

您的代码有很多错误,例如:

  • 我没看到你调用 init() 的地方。
  • 动画是局部变量,当 show 和 hide 方法完成时将被移除,这几乎是瞬时的。
  • 等等

我将使用 QGraphicsOpacityEffect 而不是直接更改不透明度,而不是使用 show 和 close 方法,而是使用 showEvent、hideEvent 和 closeEvent 方法。

import sys
from PySide2.QtCore import QEasingCurve, QEventLoop, QPropertyAnimation, QRect, QSize, Qt
from PySide2.QtGui import QColor, QPainter
from PySide2.QtWidgets import QAction, QApplication, QGraphicsOpacityEffect, QWidget


class Widget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.resize(QSize(300, 300))
        # self.setWindowOpacity(1)
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
        self.setAttribute(Qt.WA_TranslucentBackground)
        self.setContextMenuPolicy(Qt.ActionsContextMenu)

        quit_action = QAction(self.tr("E&xit"), self)
        quit_action.setShortcut(self.tr("Ctrl+Q"))
        quit_action.triggered.connect(self.close)
        self.addAction(quit_action)

        effect = QGraphicsOpacityEffect(self, opacity=1.0)
        self.setGraphicsEffect(effect)
        self._animation = QPropertyAnimation(
            self,
            propertyName=b"opacity",
            targetObject=effect,
            duration=500,
            startValue=0.0,
            endValue=1.0,
        )

    def paintEvent(self, event):
        qp = QPainter(self)
        qp.setRenderHint(QPainter.Antialiasing, True)
        qp.setBrush(QColor().fromRgb(2, 106, 194))
        qp.setPen(QColor().fromRgb(2, 106, 194))
        qp.drawRoundedRect(QRect(0, 0, 300, 300), 16, 8)

    def fade_in(self):
        self._animation.setDirection(QPropertyAnimation.Forward)
        self._animation.start()

    def fade_out(self):
        loop = QEventLoop()
        self._animation.finished.connect(loop.quit)
        self._animation.setDirection(QPropertyAnimation.Backward)
        self._animation.start()
        loop.exec_()

    def showEvent(self, event):
        super().showEvent(event)
        self.fade_in()

    def closeEvent(self, event):
        # fade out
        self.fade_out()
        super().closeEvent(event)

    def hideEvent(self, event):
        # fade out
        self.fade_out()
        super().hideEvent(event)


if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())