必须考虑以下几点:
- 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())
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"
}
}
输出: