python - 如何在 pyqt5 中为旋转设置动画?
问题描述
如何为旋转设置动画?就我而言,我有一个 QVariant 类型的角度。阅读文档时,我看到要使用 QVariantAnimation 为某些东西设置动画,我的变量必须是 QVariant 类型,在这种情况下 Float 是。但是我的代码没有运行。我不知道 float 在 Qt 的最后一个版本中是否是 QVariant 并且仅此而已。
这是我的代码,有人会帮助我吗?提前致谢!
from PyQt5 import QtWidgets, QtCore, QtGui
import sys
pen = QtGui.QPen(QtGui.QColor(0, 24, 128, 200), 10, style=QtCore.Qt.SolidLine, cap=QtCore.Qt.SquareCap)
class Window(QtWidgets.QMainWindow):
def __init__(self):
super(Window, self).__init__()
central_widget = QtWidgets.QWidget()
self.scene = QtWidgets.QGraphicsScene(self)
self.view = QtWidgets.QGraphicsView(self.scene)
self.view.setSceneRect(self.view.mapToScene(self.view.viewport().rect()).boundingRect())
self.btn = QtWidgets.QPushButton('Rotate')
self.btn.clicked.connect(self.animateRotation)
hbox = QtWidgets.QHBoxLayout(central_widget)
hbox.addWidget(self.view)
hbox.addWidget(self.btn)
self.scene.addEllipse(QtCore.QRectF(0, 0, 100, 250), pen=pen)
self.view.setBackgroundBrush(QtGui.QBrush(QtCore.Qt.CrossPattern))
self.setCentralWidget(central_widget)
print(self.scene.items()[0])
def rot(self, angle: QtCore.QVariant) -> None:
self.view.rotate(self.scene.items()[0].rotation()-angle)
self.scene.items()[0].setRotation(angle)
@QtCore.pyqtSlot()
def animateRotation(self):
animation = QtCore.QVariantAnimation()
animation.setStartValue(QtCore.QVariant(0))
animation.setEndValue(QtCore.QVariant(45))
animation.start(QtCore.QAbstractAnimation.DeleteWhenStopped)
animation.valueChanged.connect(self.rot)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())
解决方案
问题是动画变量的生命周期,因为它是一个局部变量,只有在 animateRotation 执行完毕后才会销毁,也就是动画一开始,动画就不会起作用。
解决方案是延长变量的生命周期,在 Qt 的情况下有以下选项:
通过更改
animation
为 来制作类的变量属性self.animation
。将具有较长生命周期的父级传递给
QVariantAnimation
,例如self
变量:animation = QtCore.QVariantAnimation(self)
。
推荐阅读
- php - 加载共享库时出现 PHP 错误:libssl.so.1.0.0:无法打开共享对象文件:没有这样的文件或目录
- javascript - Url Loader,加载我的背景图片一次然后刷新页面后它无法出现
- git - Windows 上的 Git 可读性问题
- c# - 复选框控件的 AsyncPostBackTrigger 未触发
- reactjs - 如何在 Reactjs 中访问值
- amazon-web-services - elasticsearch 仅显示 1 个关于使用 logstash 进行数据迁移的 docs.count
- javascript - 谷歌表格侧边栏文本区域到服务器端脚本
- ubuntu-16.04 - Ubuntu服务器负载和内存突然下降
- android - 数据建模关系与 DynamoDB
- java - 如何生成两个大于 10^25 的素数 p1、p2