You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何组织纯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构建项目的话,常规操作就行:

  1. 创建build目录:mkdir build && cd build
  2. 生成构建文件:cmake ..
  3. 编译:make(或者ninja,看你选的生成器)
  4. 运行各个目标:./demo_app、./unit_test_app、./usability_test_app

如果你用的是Qt Creator,它会自动识别CMake里的多个可执行目标,直接在顶部的运行下拉菜单里选对应的入口就行,非常方便。

补充:如果用QMake怎么办?

要是你习惯用QMake,也可以用子项目的方式实现:

  1. 根目录的QMLMultiEntryProject.pro:
TEMPLATE = subdirs
SUBDIRS += demo unit-tests usability-tests

# 把共享QML组件做成资源文件
RESOURCES += src/shared/qml_shared.qrc
  1. 每个子目录(比如demo)的demo.pro:
QT += quick
SOURCES += main.cpp
RESOURCES += main.qml ../shared/qml_shared.qrc

这样每个子项目都能引用到共享的QML组件,同样可以独立编译运行。

这样调整后,每个入口都完全独立,MyComponent.qml只需要维护一份,完美实现复用需求啦!

内容的提问来源于stack exchange,提问作者detly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:40:10