如何组织纯QML项目以实现组件复用及多独立测试入口?
嘿,这个需求我之前帮人处理过好几次,完全可以通过调整项目结构和构建配置来实现,咱们一步步来捋清楚:
第一步:重构项目目录结构
首先把不同用途的代码拆分到独立目录,同时把可复用的QML组件单独存放,这样结构更清晰,也方便后续维护:
your-qml-project/ ├── src/ │ ├── shared/ │ │ └── MyComponent.qml # 你的可复用QML组件,只存一份 │ ├── demo/ │ │ ├── main.cpp # 原有的Demo逻辑入口 │ │ └── main.qml # Demo对应的主QML文件 │ ├── unit-tests/ │ │ └── main.cpp # 单元测试的main入口 │ └── usability-tests/ │ └── main.cpp # 可用性测试的main入口 └── CMakeLists.txt # 根构建配置文件(以CMake为例,Qt项目最常用)
第二步:配置构建系统(CMake版本)
咱们要让每个入口都能编译成独立的可执行文件,同时都能找到MyComponent.qml。这里把共享组件做成QML模块,这样各个入口都能通过import直接引用,非常方便:
根目录的CMakeLists.txt示例:
cmake_minimum_required(VERSION 3.16) project(QMLMultiEntryProject) set(CMAKE_CXX_STANDARD 17) set(CMAKE_INCLUDE_CURRENT_DIR ON) # 找到Qt相关组件 find_package(Qt6 REQUIRED COMPONENTS Core Quick) qt_standard_project_setup() # 把共享QML组件打包成可导入的模块 qt_add_qml_module(shared_qml URI MySharedComponents VERSION 1.0 QML_FILES src/shared/MyComponent.qml ) # 构建Demo可执行文件 qt_add_executable(demo_app src/demo/main.cpp src/demo/main.qml ) target_link_libraries(demo_app PRIVATE Qt6::Core Qt6::Quick shared_qml) # 注册Demo自己的QML模块 qt_add_qml_module(demo_app URI DemoApp VERSION 1.0 QML_FILES src/demo/main.qml ) # 构建单元测试可执行文件 qt_add_executable(unit_test_app src/unit-tests/main.cpp ) target_link_libraries(unit_test_app PRIVATE Qt6::Core Qt6::Quick shared_qml) # 构建可用性测试可执行文件 qt_add_executable(usability_test_app src/usability-tests/main.cpp ) target_link_libraries(usability_test_app PRIVATE Qt6::Core Qt6::Quick shared_qml)
第三步:在各个入口的QML中引用共享组件
比如在Demo的main.qml里,只需要通过import引入咱们的共享模块,就能直接使用MyComponent了:
import QtQuick 6.0 import MySharedComponents 1.0 // 导入共享组件模块 Window { width: 640 height: 480 visible: true title: qsTr("Demo App") MyComponent { anchors.centerIn: parent // 这里可以根据需要设置组件的属性 } }
第四步:编译和运行
用CMake构建项目的话,常规操作就行:
- 创建build目录:
mkdir build && cd build - 生成构建文件:
cmake .. - 编译:
make(或者ninja,看你选的生成器) - 运行各个目标:
./demo_app、./unit_test_app、./usability_test_app
如果你用的是Qt Creator,它会自动识别CMake里的多个可执行目标,直接在顶部的运行下拉菜单里选对应的入口就行,非常方便。
补充:如果用QMake怎么办?
要是你习惯用QMake,也可以用子项目的方式实现:
- 根目录的
QMLMultiEntryProject.pro:
TEMPLATE = subdirs SUBDIRS += demo unit-tests usability-tests # 把共享QML组件做成资源文件 RESOURCES += src/shared/qml_shared.qrc
- 每个子目录(比如demo)的
demo.pro:
QT += quick SOURCES += main.cpp RESOURCES += main.qml ../shared/qml_shared.qrc
这样每个子项目都能引用到共享的QML组件,同样可以独立编译运行。
这样调整后,每个入口都完全独立,MyComponent.qml只需要维护一份,完美实现复用需求啦!
内容的提问来源于stack exchange,提问作者detly
相关产品推荐
相关产品推荐

