【问题标题】:Implementing a Lottie JSON animation into PyQt5在 PyQt5 中实现 Lottie JSON 动画
【发布时间】:2021-09-26 11:38:57
【问题描述】:

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

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

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

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

【问题讨论】:

  • “必须在 PyQt5 中实现为样式表”:这与样式表完全无关,也与 Qt style sheets 无关,后者用于使用预定义的 set of properties 设置 QWidget 的样式。 Lottie 通过 QML 在 Qt 上工作(正如您链接的帖子所解释的那样),因此您需要先学习如何使用它。
  • 关于您的编辑:对不起,但这不是 StackOverflow 的范围。我们提供特定代码/编程问题的答案,这不是一个操作指南或教程网站,并且在这些情况下非常不鼓励提供“示例代码”。我建议你开始学习 QML 以及如何在 Python 中使用它,这样你就可以了解它是如何工作的,并且能够以更高的意识实现你想要的。

标签: pyqt5 lottie


【解决方案1】:

必须考虑以下几点:

  • 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”和文件夹“Qt/5.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())

ma​​in.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"
    }
}

输出:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 2019-11-30
    • 2019-01-04
    • 1970-01-01
    • 2018-12-21
    • 2022-09-24
    相关资源
    最近更新 更多