QPropertyAnimation不使用窗口不透明度

2024-09-29 21:40:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在设置一个新的桌面小部件,使我的工作生活更轻松,并使用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个月左右的代码。你知道吗


Tags: 代码selfdefshowwidgetqtqpqcolor
1条回答
网友
1楼 · 发布于 2024-09-29 21:40:22

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

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

相关问题 更多 >

    热门问题