【问题标题】:QPropertyAnimation not working with Window OpacityQPropertyAnimation 不适用于窗口不透明度
【发布时间】:2019-09-06 20:11:10
【问题描述】:

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

我在一个个性化的类中实现 QPropertyAnimation 以使我的生活更轻松,但由于它最初没有起作用,我将它带回了类代码,它仍然非常顽固。目前我已经尝试过了。

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 个月左右的代码。

【问题讨论】:

    标签: python python-3.x pyside2 qpropertyanimation


    【解决方案1】:

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

    • 我看不出你在哪里调用 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_())
    

    【讨论】:

    • 效果很好。为什么以 QPropertyAnimation 中的 QGraphics 对象而不是小部件本身为目标?
    猜你喜欢
    • 2014-04-25
    • 2015-02-18
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 2013-02-21
    • 2019-04-24
    • 2010-12-31
    相关资源
    最近更新 更多