python - QVariantAnimation of opacity : 项目出现在动画的最后
问题描述
这是一个示例,其中图形项目出现在动画的末尾,而不是像它应该的那样逐渐出现。
import sys
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtCore import Qt, QEasingCurve
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QMainWindow, QGraphicsScene, QGraphicsView, QGraphicsPixmapItem, QGraphicsItem
class QStone(QGraphicsPixmapItem):
def __init__(self):
QGraphicsPixmapItem.__init__(self)
white = QPixmap("white2.png")
self.setPixmap(white.scaled(60, 60, Qt.KeepAspectRatio))
self.w = self.boundingRect().width()
self.h = self.boundingRect().height()
class QBoard(QGraphicsView):
def __init__(self,scene):
QGraphicsView.__init__(self)
self.scene=scene
self.setScene(scene)
def display_stone(self, x, y):
stone = QStone()
stone.setZValue(10)
stone.setOpacity(0)
stone.setPos(x - stone.w / 2, y - stone.h / 2)
self.scene.addItem(stone)
animation = QtCore.QVariantAnimation(self.scene)
animation.setDuration(3000)
animation.valueChanged.connect(stone.setOpacity)
# animation.setStartValue(0)
# animation.setEndValue(1)
animation.setParent(self.scene)
animation.setEasingCurve(QEasingCurve.BezierSpline)
animation.start()
class MainWindow(QMainWindow):
def __init__(self):
#all the usual stuff
QMainWindow.__init__(self)
centralWidget = QtWidgets.QWidget(self)
self.setCentralWidget(centralWidget)
mainLayout = QtWidgets.QGridLayout()
centralWidget.setLayout(mainLayout)
self.scene = QGraphicsScene()
self.view = QBoard(self.scene)
mainLayout.addWidget(self.view,0,0)
self.scene.setSceneRect(-200.0,-150.0,400.0,300.0)
self.view.display_stone(0,0)
app = QtWidgets.QApplication(sys.argv)
main_win = MainWindow()
main_win.show()
sys.exit(app.exec_())
而不是white2.png,请放置任何图像文件。
知道为什么它会这样工作吗?
总而言之,我也可以使用 QPropertyAnimation ,但对于可能相同的结果,它的工作量更大。
解决方案
QVariantAnimation 使用从 startValue 和 endValue 中传递的值扣除的数据类型生成动画,在您的情况下,不放置它意味着使用整数,或者放置相同的 0 和 1 使得在插值中使用整数值。哪些整数值可以在 0 和 1 之间进行插值?t = 0.5 * T
因为只有0和1,例如对于它作为 0.0 的 startValue 和 1.0 的 endValue。
animation = QtCore.QVariantAnimation(self.scene)
animation.setDuration(3000)
animation.valueChanged.connect(stone.setOpacity)
animation.setStartValue(0.0) # <---
animation.setEndValue(1.0) # <---
animation.setParent(self.scene)
animation.setEasingCurve(QEasingCurve.BezierSpline)
animation.start()
推荐阅读
- javascript - 创建javascript动态svg
- javascript - 我如何等待列表中的每个元素使用 cypress 更新为特定文本
- amazon-dynamodb - 错误:表尚未注册,在 DynamoDB 中
- kubernetes - k8s:由于内存不足,无法删除部署
- javascript - Javascript/Codeigniter 中的价格计算
- sequelize.js - Sequelize 按字母顺序读取迁移文件,但我需要不同的排序
- excel - Do While freq.Value <> " " 'if freq in range >< empty --> ERROR BUG
- python-3.x - 如何从胶囊层打印输出向量?
- java - 如何从一个流中过滤不包含在另一个流中的字符串?
- git - 我对很多文件进行了更改,但还没有提交。如何退出所有更改?