在PyQt5中为QLabel的FontSize设置动画



我想问我们是否可以用QPropertyAnimation在PyQt5中动画化QLabel的字体大小。

我尝试添加QPropertyAnimation(self.label , b"fontSize"),但它不起作用,我收到了警告

我想让你增加QLabel的文本,然后再次切换到正常大小的

来自QPropertyAnimation描述:

QPropertyAnimation在Qt属性上插值。由于属性值存储在QVariants中,该类继承了QVariantAnimation,并支持与其超类相同元类型的动画。

声明属性的类必须是QObject。为了使属性动画化成为可能,它必须提供一个setter(这样QPropertyAnimation就可以设置属性的值(。

所有从QObject继承的类(包括小部件(都支持Qt属性,事实上,它们中的大多数都有";内置";属性,但显然,并非所有属性都支持动画:它们必须基于数值。您可以设置数字变化的动画(例如:从0到100(,而不是文本(例如从"ABC"到"PYZ"(。

例如,所有QWidget都有一个pos属性,并且由于该属性(即QPoint(是基于数字的,因此可以创建动画。您可以在QVariantAnimation文档中看到支持的动画变体类型列表。考虑到所有关于QObject子类的文档页面都包含属性部分(例如,请参阅QWidget属性(,并且属性显然是从它们的超类继承的。

字体size没有属性,因此有两种可能性:

  1. 创建一个自定义属性(通过使用PyQt中的pyqtProperty装饰器(
  2. 使用QVariantAnimation,它不绑定到任何属性

根据情况,人们可能更喜欢一种或另一种方法,但对于这种特定情况,它没有太大变化;QVariantAnimation当然更简单,Qt属性方法更"简单";顺应性";。

在这里,您可以看到如何使用pyqtProperty装饰器创建属性。由于动画写入属性,因此必须具有setter。

class AnimationTest(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.startButton = QtWidgets.QPushButton('Start')
self.label = QtWidgets.QLabel('Hello!')
self.labelFont = self.font()
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(self.startButton)
layout.addWidget(self.label)
self.ani = QtCore.QPropertyAnimation(self, b'labelFontSize')
self.ani.setStartValue(10)
self.ani.setEndValue(80)
self.ani.setDuration(1500)
self.startButton.clicked.connect(self.ani.start)
@QtCore.pyqtProperty(int)
def labelFontSize(self):
return self.labelFont.pointSize()
@labelFontSize.setter
def labelFontSize(self, size):
self.labelFont.setPointSize(size)
self.label.setFont(self.labelFont)

import sys
app = QtWidgets.QApplication(sys.argv)
test = AnimationTest()
test.show()
sys.exit(app.exec_())

变体动画当然更短:

class AnimationTest(QtWidgets.QWidget):
def __init__(self):
# ...
self.ani = QtCore.QVariantAnimation()
self.ani.setStartValue(10)
self.ani.setEndValue(80)
self.ani.setDuration(1500)
self.ani.valueChanged.connect(self.updateLabelFont)
self.startButton.clicked.connect(self.ani.start)
def updateLabelFont(self, value):
self.labelFont.setPointSize(value)
self.label.setFont(self.labelFont)

请注意,字体大小的动画通常是有问题的,因为大多数字体的字形和间距根据大小略有不同。在上面的例子中,我使用了一个很长的动画,它可能会显示效果:虽然大小线性增加,但字体的变化通常不是很平滑。

最新更新