在 PyQt5 中实现 Lottie JSON 动画

Implementing a Lottie JSON animation into PyQt5

我正在开发 PyQt5 应用程序,我想将 Lottie JSON 动画引入其中。我进行了广泛的搜索,但只能找到类似 convert Lottie JSON to GIF/MP4 这样的结果。但这不是我真正想要的。 我从 Qt 网站上找到了 something

我假设必须在上面的代码中进行一些更改,然后必须在 PyQt5 中实现为 样式 sheet。但我对样式表完全陌生

有人可以给出一个将 Lottie JSON 实现到 PyQt5 中的简短示例吗?

编辑 1: 根据@musicamante 发表的评论,据说 Qt 为 Lottie 使用了 QML。我找到了这个 example usage。有人可以给出简短的 Python 实现吗?

必须考虑以下因素:

  • QtLottie 仅支持部分功能(至少在 Qt5 中,请参阅 this 了解更多信息)
  • PyQt5 默认不提供 QtLottie。

最后,因为 QtLottie 只专注于 QML,所以没有必要为 Python 创建绑定,而是复制二进制文件。首先要知道编译 PyQt5 的 Qt 版本:

python -c "from PyQt5.QtCore import QT_VERSION_STR; print('Qt version', QT_VERSION_STR)"

对于 PyQt5 5.15.4,它是用 Qt 5.15.2 编译的。

要获取 Qt 二进制文件,您可以使用 aqtinstall 并下载 qtlottie(以下命令适用于 linux)。

python -m pip install aqtinstall
python -m aqt install --outputdir Qt 5.15.2 linux desktop -m qtlottie

要知道复制到哪个文件夹,必须执行以下命令:

python -c "from pathlib import Path; import PyQt5; print(Path(PyQt5.__file__).resolve().parent / 'Qt5')"

我们称之为 PyQt5_DIR。

所以你应该将文件“Qt/5.15.2/gcc_64/lib/libQt5Bodymovin.so.5.15.2”复制到“PyQt5_DIR/lib/libQt5Bodymovin.so.5”和文件夹“[=47” =].15.2/gcc_64/qml/Qt/labs/lottieqt" 到 "PyQt5_DIR/qml/Qt/labs".

现在的解决方案是使用 QQuickWidget 以便能够将 QML 与 QtWidgets 一起使用:

import os
import sys
from pathlib import Path

from PyQt5 import QtCore, QtWidgets, QtQuickWidgets

CURRENT_DIRECTORY = Path(__file__).resolve().parent


if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)

    label_widget = QtWidgets.QLabel("Animation", alignment=QtCore.Qt.AlignCenter)

    animation_widget = QtQuickWidgets.QQuickWidget(
        resizeMode=QtQuickWidgets.QQuickWidget.SizeRootObjectToView
    )
    filename = os.fspath(CURRENT_DIRECTORY / "main.qml")
    url = QtCore.QUrl.fromLocalFile(filename)
    animation_widget.setSource(url)

    widget = QtWidgets.QWidget()
    lay = QtWidgets.QVBoxLayout(widget)
    lay.addWidget(label_widget, stretch=0)
    lay.addWidget(animation_widget, stretch=1)
    widget.resize(640, 480)
    widget.show()

    sys.exit(app.exec())

main.qml

import QtQuick 2.15
import Qt.labs.lottieqt 1.0

Item {
    width: 100
    height: 100
    LottieAnimation {
        anchors.fill: parent
        loops: LottieAnimation.Infinite
        source: "https://assets9.lottiefiles.com/temp/lf20_7rPCHc.json"
    }
}

输出: