gpt4 book ai didi

python - QPropertyAnimation 不适用于窗口不透明度

转载 作者:行者123 更新时间:2023-12-01 07:18:33 26 4
gpt4 key购买 nike

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

最佳答案

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

  • 我不明白你在哪里调用了 init()。
  • 动画是局部变量,当 show 和 hide 方法完成时,动画将被删除,这几乎是瞬时的。
  • 等等

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

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

关于python - QPropertyAnimation 不适用于窗口不透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57828052/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com