【问题标题】:Animating FontSize of a QLabel in PyQt5PyQt5 中 QLabel 的 FontSize 动画
【发布时间】:2021-06-25 11:51:24
【问题描述】:

我想问一下我们是否可以在 PyQt5 中使用 QPropertyAnimation 为 QLabel 的字体大小设置动画。

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

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

【问题讨论】:

  • 您好,欢迎来到 StackOverflow。请考虑在提问时始终提供详细信息(花点时间阅读How to Ask 好问题):“它不起作用”对我们来说并不是真正有用,但您可以向我们展示您实际尝试过的内容。另外,您指的是什么警告?
  • 我写了..见第二段。
  • 我指的是这个警告:尝试为非属性动画制作动画

标签: python animation pyqt5 qpropertyanimation


【解决方案1】:

来自QPropertyAnimation description

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

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

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

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

但是,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)

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

【讨论】:

  • 感谢您的回答,我会检查这段代码是否运行
  • @0xsapphir3 不客气,但请考虑,如果答案的解决方案确实解决了您的问题,请先尝试,然后再将其设置为已接受。
  • 嗯,第一个代码给了我一个错误,但第二个工作有效。非常感谢! :)
  • @0xsapphir3 请记住 StackOverflow 是一个社区的努力。说“它给了我一个错误”不仅对你没有用,而且对任何其他可能面临类似问题的人都是没有用的。你遇到了什么错误?您是否完全按照我的建议实现了代码?如果您对所提供的解决方案有任何问题,您应该始终澄清问题所在:这对很多人可能很重要,包括那些试图帮助您的人。 共同共享​​>知识非常、非常重要。
  • 这是我的错误,我没有导入 pyqtSignal,这就是我收到错误的原因。无论如何,我已经解决了这个问题,所以这就是我没有粘贴错误的原因。
猜你喜欢
  • 2019-04-23
  • 2019-04-06
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-18
  • 2017-03-07
相关资源
最近更新 更多