Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions devel/1056.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# [1056] 添加 QtQuick、Qml、Lottie (Bodymovin) 依赖

## 1 相关文档
- [dddd.md](dddd.md) - 任务文档模板

## 2 任务相关的代码文件
- xmake/packages/q/qtbase/xmake.lua
- xmake.lua
- xmake/tests.lua
- tests/Plugins/Qt/qtquick_test.cpp

## 3 如何测试

### 3.1 确定性测试(单元测试)
```
xmake b qtquick_test && xmake r qtquick_test
```
测试文件:`tests/Plugins/Qt/qtquick_test.cpp`,验证 QtQml、QtQuick、QtBodymovin 三个模块的头文件编译、链接和运行时加载均正常。

### 3.2 非确定性测试(文档验证)
```
xmake f -c && xmake f --mode=debug && xmake b stem
# 验证链接阶段能找到 Qt6Qml、Qt6Quick、Qt6Bodymovin
```

## 4 如何提交

提交前执行以下最少步骤:

```bash
xmake b stem
```

## 5 What
为项目添加 QtQuick、Qml 和 Lottie (Bodymovin) 的依赖,供后续 QtQuick 相关功能开发使用。

1. 在 `qtbase/xmake.lua` 的 aqt install 参数中追加 `qtlottie` 模块,使 Qt SDK 安装时下载 Lottie 动画模块
2. 在 `xmake.lua` 的 `libmogan` 和 `stem` 目标中添加 `add_frameworks("QtQml", "QtQuick", "QtBodymovin")`
3. 在 `xmake/tests.lua` 的 `add_target_cpp_test` 和 `add_target_cpp_bench` 中添加 `add_frameworks("QtQml", "QtQuick", "QtBodymovin")`,使测试目标也能链接这些模块
4. 新增 `tests/Plugins/Qt/qtquick_test.cpp` 单元测试,验证三个模块的编译、链接和运行时加载

## 6 Why
QtQuick/Qml 是 Qt 的声明式 UI 框架,Lottie (Bodymovin) 用于渲染 Adobe After Effects 导出的动画。后续需要基于 QtQuick 开发新功能,因此需要提前在构建系统中配置好这些依赖。

## 7 How
参考项目中 `QtSvg`、`QtNetworkAuth` 等模块的添加方式:这些模块通过 `qt6base` 安装时自带,不需要单独的 `add_requires`,只需在目标中通过 `add_frameworks` 声明即可。

关键发现:Qt 6.8.3 的 Lottie 模块安装后,其 C++ 库名为 `Qt6Bodymovin`(而非 `Qt6LottieQml`),`aqtinstall` 中的模块名为 `qtlottie`(而非 `qtlottieanimation`)。
50 changes: 50 additions & 0 deletions tests/Plugins/Qt/qtquick_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/******************************************************************************
* MODULE : qtquick_test.cpp
* DESCRIPTION: Test that QtQuick/QML and QtBodymovin modules are linkable
* COPYRIGHT : (C) 2026 Yuki Lu
*******************************************************************************
* This software falls under the GNU general public license version 3 or later.
* It comes WITHOUT ANY WARRANTY WHATSOEVER. For details, see the file LICENSE
* in the root directory or <http://www.gnu.org/licenses/gpl-3.0.html>.
******************************************************************************/

#include <QQmlApplicationEngine>
#include <QQmlComponent>
#include <QQuickItem>
#include <QQuickWindow>
#include <QtQml>

// QtBodymovin is a Qt Labs module with only private headers in Qt 5.
// We verify linkability by including the version header.
#include <QtBodymovin/qtbodymovinversion.h>

#include <iostream>

int
main (int argc, char** argv) {
// Test 1: QCoreApplication
QCoreApplication app (argc, argv);
std::cout << "[PASS] QCoreApplication created\n";

// Test 2: QQmlApplicationEngine
QQmlApplicationEngine engine;
std::cout << "[PASS] QQmlApplicationEngine created\n";

// Test 3: QQuickWindow API
QQuickWindow::setDefaultAlphaBuffer (false);
std::cout << "[PASS] QQuickWindow API accessible\n";

// Test 4: QUrl
QUrl testUrl ("qrc:/test.qml");
std::cout << "[PASS] QUrl created\n";

// Test 5: QtBodymovin version header compiled and linked
std::cout << "[PASS] QtBodymovin header included (version "
<< QTBODYMOVIN_VERSION_STR << ")\n";

// Test 6: Qt runtime version
std::cout << "[INFO] Qt runtime version: " << qVersion () << "\n";

std::cout << "\nAll QtQuick + QtBodymovin tests passed!\n";
return 0;
}
2 changes: 2 additions & 0 deletions xmake.lua
Original file line number Diff line number Diff line change
Expand Up @@ -612,6 +612,7 @@ target("libmogan") do
print("No need to install libmogan")
end)
add_frameworks("QtGui", "QtWidgets", "QtCore", "QtPrintSupport", "QtSvg", "QtNetwork", "QtNetworkAuth")
add_frameworks("QtQml", "QtQuick", "QtBodymovin")

build_glue_on_config()
set_configvar("QTTEXMACS", 1)
Expand Down Expand Up @@ -966,6 +967,7 @@ target("stem") do
end

add_frameworks("QtGui", "QtWidgets", "QtCore", "QtPrintSupport", "QtSvg", "QtNetwork", "QtNetworkAuth")
add_frameworks("QtQml", "QtQuick", "QtBodymovin")
add_packages("s7")
add_packages("lolly")
add_deps("libmogan")
Expand Down
1 change: 1 addition & 0 deletions xmake/packages/q/qtbase/xmake.lua
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,7 @@ package("qtbase")
table.insert(aqt_args, "-m")
table.insert(aqt_args, "qtimageformats")
table.insert(aqt_args, "qtnetworkauth")
table.insert(aqt_args, "qtlottie")

os.vrunv("aqt", aqt_args)

Expand Down
2 changes: 2 additions & 0 deletions xmake/tests.lua
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ function add_target_cpp_test(filepath, dep1, dep2)
end
add_rules("qt.console")
add_frameworks("QtGui", "QtWidgets", "QtCore", "QtPrintSupport", "QtSvg", "QtTest", "QtNetwork")
add_frameworks("QtQml", "QtQuick", "QtBodymovin")
if not is_plat("windows") then
add_syslinks("pthread")
end
Expand Down Expand Up @@ -75,6 +76,7 @@ function add_target_cpp_bench(filepath, dep)
end
add_rules("qt.console")
add_frameworks("QtGui", "QtWidgets", "QtCore", "QtPrintSupport", "QtSvg", "QtTest", "QtNetwork")
add_frameworks("QtQml", "QtQuick", "QtBodymovin")
if not is_plat("windows") then
add_syslinks("pthread")
end
Expand Down
Loading