QT创建子目录项目,可以让项目组织成树形结构的示例:在项目中同时创建Application和第三方动态库(内部)

该博客介绍了Qt项目开发流程。先新建子目录项目,接着创建Application和动态库,之后在Application项目添加动态链接库,添加库会在pro文件生成代码,最后添加上头文件,在动态库项目添加求和成员函数进行测试。

目录

1、新建子目录项目

2、创建Application 

3、创建动态库

4、Application项目添加动态链接库。

5、测试


1、新建子目录项目

文件》新建文件或项目》其他项目》子目录项目:

点击Choose,设置名称和创建路径 

 后面一直点击下一步直至子目录项目创建完成后:

2、创建Application 

在上一步创建完成后弹出的新建子项目框中,Application》Qt Widgets Application 

点击Choose,设置名称(创建路径默认即可)

<think> 我们正在处理一个大型Qt C++项目,需要设计一个合理的目录结构。结合之前的讨论Qt项目的特性,我们可以设计如下: ### 大型Qt C++项目目录结构组织 #### 核心原则 1. **模块化与分层**:将项目划分为独立的模块,每个模块具有明确的职责,便于团队协作代码复用。 2. **分离界面与业务逻辑**:参考MVVM模式[^1],将界面(View)、业务逻辑(Model)视图模型(ViewModel)分离。 3. **依赖管理**:使用工厂模式[^4]外观模式[^3]来管理模块间的依赖,降低耦合度。 #### 推荐目录结构 ```bash project_root/ ├── app/ # 应用程序入口 │ ├── main.cpp # 主函数 │ └── ... ├── core/ # 核心基础设施(非业务相关) │ ├── logging/ # 日志模块 │ ├── utils/ # 工具类 │ └── ... ├── domain/ # 业务领域模块(按功能划分) │ ├── module1/ # 模块1(例如:用户管理) │ │ ├── model/ # 数据模型 │ │ ├── view/ # 视图(Qt界面文件*.ui) │ │ ├── viewmodel/ # 视图模型(ViewModel) │ │ └── internal/ # 模块内部私有实现 │ └── module2/ # 模块2 ├── services/ # 跨领域服务(例如:网络通信、数据库) │ ├── network/ # 网络服务 │ └── database/ # 数据库服务 ├── interfaces/ # 对外接口(API) │ ├── module1_api.h # 模块1的接口 │ └── ... ├── resources/ # 资源文件(图片、样式表、翻译文件等) │ ├── images/ │ ├── qss/ # Qt样式表 │ └── translations/ # 多语言翻译文件 ├── third_party/ # 第三方库(源码形式) ├── lib/ # 预编译的第三方库动态库/静态库) ├── tests/ # 测试代码 │ ├── unit_tests/ # 单元测试 │ └── integration_tests/ # 集测试 ├── docs/ # 文档 ├── scripts/ # 构建部署脚本 ├── CMakeLists.txt # 根CMake配置文件 └── README.md ``` #### 关键目录说明 1. **`domain/`目录**:按业务功能划分模块,每个模块内部采用MVVM结构: - `model/`:纯业务逻辑,不依赖Qt GUI[^2] - `view/`:存放`.ui`文件自定义控件 - `viewmodel/`:连接ViewModel的桥梁,处理界面逻辑 2. **`services/`目录**:提供全局服务,通过外观模式[^3]封装复杂子系统: ```cpp // 示例:网络服务外观类 class NetworkService { public: static void sendRequest(const Request& req) { // 内部调用多个子系统的复杂操作 } }; ``` 3. **`interfaces/`目录**:定义稳定的API接口,内部实现可变更: ```cpp // 示例:使用工厂模式[^4]创建跨平台组件 class ButtonFactory { public: static Button* createButton(ButtonType type); }; ``` #### CMake配置要点 ```cmake # 禁止在头文件目录直接构建 set(CMAKE_DISABLE_SOURCE_CHANGES ON) set(CMAKE_DISABLE_IN_SOURCE_BUILD ON) # 设置输出目录 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) # 模块化配置示例 add_subdirectory(domain/module1) add_subdirectory(services/network) # 资源文件处理(跨平台) if(WIN32) configure_file(${PROJECT_SOURCE_DIR}/resources/config.ini ${CMAKE_BINARY_DIR}/bin/config.ini COPYONLY) else() # Linux/macOS处理方式 endif() ``` #### 解耦性验证[^2] 1. **业务逻辑独立测试**: ```bash # 不启动GUI的情况下运行测试 ./test_runner --gtest_filter=BusinessLogic.* ``` 2. **模块替换测试**:替换`domain/module1`目录后,整个项目应能正常编译运行 ### 大型项目扩展建议 1. **插件架构**:将核心模块设计为动态库,通过插件机制加载 ``` plugins/ ├── module1_plugin.dll # Windows └── module1_plugin.so # Linux ``` 2. **ABI版本控制**: ```cpp // 在接口头文件中定义版本号 #define MODULE1_API_VERSION 1.2.3 ``` > **黄金法则**:目录结构应体现架构设计 > - 横向分层(core/domain/services) > - 纵向分模块(domain/module1, module2) > - 依赖方向:上层模块可依赖下层,禁止反向依赖 §§相关问题§§ 1. 如何在Qt项目中实现MVVM模式的数据绑定? 2. 大型Qt项目如何管理多语言翻译文件? 3. 如何设计Qt插件系统实现动态功能扩展? 4. CMake中如何管理Qt项目的资源文件(qrc)? </think> ### 大型Qt C++项目目录结构组织指南 基于Qt特性MVVM架构[^1],结合工厂模式[^4]外观模式[^3]的解耦思想,推荐以下目录结构设计: #### 核心架构原则 1. **MVVM分层解耦** - 界面与业务逻辑完全分离(验证标准:UI移除后核心逻辑仍可运行)[^2] - 视图(View)、视图模型(ViewModel)、模型(Model)物理隔离 2. **模块化设计** - 使用工厂模式管理界面组件创建[^4] - 采用外观模式封装复杂子系统[^3] #### 推荐目录结构 ```bash qt_project/ ├── app/ # 应用入口(可执行文件) │ ├── main.cpp # 主函数 │ └── application.cpp # QApplication管理 ├── core/ # 核心基础设施 │ ├── utils/ # 工具类(日志/配置等) │ └── di/ # 依赖注入容器 ├── domain/ # 业务领域层(MVVM的Model) │ ├── module1/ # 业务模块1 │ │ ├── model/ # 数据模型 │ │ └── service/ # 领域服务 │ └── module2/ # 业务模块2 ├── presentation/ # 表现层(MVVM的View+ViewModel) │ ├── viewmodels/ # 视图模型(ViewModel) │ │ ├── module1_vm/ # 模块1的VM │ │ └── module2_vm/ # 模块2的VM │ └── views/ # 视图(View) │ ├── widgets/ # 自定义控件 │ ├── windows/ # 主窗口 │ └── factories/ # 控件工厂[^4] ├── infrastructure/ # 基础设施层 │ ├── persistence/ # 数据持久化 │ ├── network/ # 网络服务 │ └── external/ # 外部接口适配器 ├── interfaces/ # 抽象接口 │ ├── module1_interface.h # 模块1接口 │ └── services/ # 服务外观[^3] ├── resources/ # 资源文件 │ ├── qss/ # 样式表 │ ├── images/ # 图片资源 │ └── translations/ # 多语言文件 ├── tests/ # 分层测试 │ ├── unit/ # 单元测试 │ ├── integration/ # 集测试 │ └── ui/ # 界面测试 └── third_party/ # 第三方依赖 ``` #### 关键实现细节 1. **MVVM数据绑定目录** ```cpp // presentation/viewmodels/module1_vm/SensorViewModel.h class SensorViewModel : public QObject { Q_OBJECT Q_PROPERTY(double value READ value NOTIFY valueChanged) // 业务逻辑来自domain/sensor/ }; ``` 2. **工厂模式实现控件创建**[^4] ```cpp // presentation/views/factories/WidgetFactory.cpp QWidget* WidgetFactory::createWidget(WidgetType type) { switch(type) { case Chart: return new ChartWidget(); case Gauge: return new GaugeWidget(); } } ``` 3. **外观模式封装子系统**[^3] ```cpp // interfaces/services/DataServiceFacade.h class DataServiceFacade { public: static AnalysisResult analyzeData(DataSet data) { // 调用infrastructure/networkdomain/analysis } }; ``` #### CMake配置要点 ```cmake # 模块化配置 qt_add_executable(app) qt_add_library(presentation STATIC) qt_add_library(domain STATIC) # 资源文件处理 qt_add_resources(resources "app_resources" PREFIX "/" FILES resources/qss/style.qss resources/images/logo.png ) # 工厂模式注册 target_compile_definitions(presentation PRIVATE QT_PLUGIN_CLASS_NAME=WidgetFactory ) ``` #### 解耦性验证方法[^2] 1. **独立测试业务逻辑**: ```bash # 不加载UI测试领域层 ./test_runner --gtest_filter=Domain.* ``` 2. **模块替换测试**: ```cpp // 替换视图实现而不影响ViewModel auto view = ViewFactory::createView("NewChartView"); view->setViewModel(sensorViewModel); ``` > **黄金法则**:遵循 **依赖倒置原则** > - 高层模块(views)依赖抽象(interfaces/) > - 实现细节(infrastructure/)依赖领域接口 > - 使用Qt的信号槽机制跨层通信
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值