Qt 从动画中删除键值
Qt remove a key value from an animation
我正在使用 Qt 的 Python 绑定来开发应用程序。
我通过设置自定义键值制作了一个非线性动画,
正如 Qt docs 中所说:
It is also possible to set values situated between the start and end value. The interpolation will then go by these points.
QPushButton button("Animated Button");
button.show();
QPropertyAnimation animation(&button, "geometry");
animation.setDuration(10000);
animation.setKeyValueAt(0, QRect(0, 0, 100, 30));
animation.setKeyValueAt(0.8, QRect(250, 250, 100, 30));
animation.setKeyValueAt(1, QRect(0, 0, 100, 30));
animation.start();
目标
我更新我的动画值并在几个部分中使用它,有时我想让它成为线性的。
问题
我找不到删除动画的设置关键值以使其线性化的方法。我尝试为我的动画设置“startValue”“endValue”,但它们只是替换了默认动画键值(0.0 和 1.0),而我之前设置的自定义键值将保留在那里。下面是示例代码:
import sys
from PyQt5.QtCore import QRect, QPoint, QPropertyAnimation, QParallelAnimationGroup
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QFrame
class Form(QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.resize(600, 400)
self.setWindowTitle("Form 1")
self.frame = QFrame(self)
self.frame.resize(200, 150)
self.frame.move(20, 20)
self.setStyleSheet("""QFrame {
background-color: orange;
}""")
self.button = QPushButton("Start Animation", self)
self.button.resize(self.button.sizeHint())
self.button.move(20, 300)
self.define_animation()
self.button.clicked.connect(self.frame_anim.start)
self.show()
def define_animation(self):
self.frame_anim = QPropertyAnimation(self.frame, b"geometry")
self.frame_anim.setDuration(1000)
self.frame_anim.setStartValue(self.frame.geometry())
self.frame_anim.setKeyValueAt(0.75, QRect(QPoint(20, 100), self.frame.size()))
self.frame_anim.setKeyValueAt(1, QRect(QPoint(380, 220), self.frame.size()))
self.frame_anim.finished.connect(lambda: print("ََAnimation key values", self.frame_anim.keyValues()))
self.frame_anim.finished.connect(self.define_new_animation)
def define_new_animation(self):
self.frame_anim.setStartValue(QRect(QPoint(380, 220), self.frame.size()))
self.frame_anim.setEndValue(QRect(QPoint(20, 220), self.frame.size()))
app = QApplication(sys.argv)
form = Form()
sys.exit(app.exec_())
第一个动画是非线性的,我设置了自定义键值,但下一个将保留该键值。
我正在寻找一种解决方案,以从动画中删除设置的键值,或在设置自定义键值后使其线性化的任何逻辑方法。
setStartValue
和setEndValue
都不会“清除”当前动画,只会设置new开始和beginnig的状态,同时离开所有其他嵌套对象。
为了更新当前动画并重置其所有关键点,您需要使用 setKeyValues()
和空映射来清除现有映射。
这是一个可能的解决方案:
class Form(QMainWindow):
# ...
def define_new_animation(self):
self.frame_anim.setKeyValues({})
self.frame_anim.setStartValue(
QRect(QPoint(380, 220), self.frame.size()))
self.frame_anim.setEndValue(
QRect(QPoint(20, 220), self.frame.size()))
我正在使用 Qt 的 Python 绑定来开发应用程序。 我通过设置自定义键值制作了一个非线性动画, 正如 Qt docs 中所说:
It is also possible to set values situated between the start and end value. The interpolation will then go by these points.
QPushButton button("Animated Button");
button.show();
QPropertyAnimation animation(&button, "geometry");
animation.setDuration(10000);
animation.setKeyValueAt(0, QRect(0, 0, 100, 30));
animation.setKeyValueAt(0.8, QRect(250, 250, 100, 30));
animation.setKeyValueAt(1, QRect(0, 0, 100, 30));
animation.start();
目标
我更新我的动画值并在几个部分中使用它,有时我想让它成为线性的。
问题
我找不到删除动画的设置关键值以使其线性化的方法。我尝试为我的动画设置“startValue”“endValue”,但它们只是替换了默认动画键值(0.0 和 1.0),而我之前设置的自定义键值将保留在那里。下面是示例代码:
import sys
from PyQt5.QtCore import QRect, QPoint, QPropertyAnimation, QParallelAnimationGroup
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QFrame
class Form(QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.resize(600, 400)
self.setWindowTitle("Form 1")
self.frame = QFrame(self)
self.frame.resize(200, 150)
self.frame.move(20, 20)
self.setStyleSheet("""QFrame {
background-color: orange;
}""")
self.button = QPushButton("Start Animation", self)
self.button.resize(self.button.sizeHint())
self.button.move(20, 300)
self.define_animation()
self.button.clicked.connect(self.frame_anim.start)
self.show()
def define_animation(self):
self.frame_anim = QPropertyAnimation(self.frame, b"geometry")
self.frame_anim.setDuration(1000)
self.frame_anim.setStartValue(self.frame.geometry())
self.frame_anim.setKeyValueAt(0.75, QRect(QPoint(20, 100), self.frame.size()))
self.frame_anim.setKeyValueAt(1, QRect(QPoint(380, 220), self.frame.size()))
self.frame_anim.finished.connect(lambda: print("ََAnimation key values", self.frame_anim.keyValues()))
self.frame_anim.finished.connect(self.define_new_animation)
def define_new_animation(self):
self.frame_anim.setStartValue(QRect(QPoint(380, 220), self.frame.size()))
self.frame_anim.setEndValue(QRect(QPoint(20, 220), self.frame.size()))
app = QApplication(sys.argv)
form = Form()
sys.exit(app.exec_())
第一个动画是非线性的,我设置了自定义键值,但下一个将保留该键值。 我正在寻找一种解决方案,以从动画中删除设置的键值,或在设置自定义键值后使其线性化的任何逻辑方法。
setStartValue
和setEndValue
都不会“清除”当前动画,只会设置new开始和beginnig的状态,同时离开所有其他嵌套对象。
为了更新当前动画并重置其所有关键点,您需要使用 setKeyValues()
和空映射来清除现有映射。
这是一个可能的解决方案:
class Form(QMainWindow):
# ...
def define_new_animation(self):
self.frame_anim.setKeyValues({})
self.frame_anim.setStartValue(
QRect(QPoint(380, 220), self.frame.size()))
self.frame_anim.setEndValue(
QRect(QPoint(20, 220), self.frame.size()))