CMake 在工程管理中的使用 Window/MacOS

CMake 在工程管理中的使用 Window/MacOS

是什么

CMake 是一个跨平台的编译工具,可以用简单的语句来描述所有平台的编译过程。

编译工具

Visual Studio 自动解析编译 cmakelists.txt

编译与链接

编译:将当前的C++/C 代码通过编译器,编译位目标代码的过程。

链接:将多个编译好的目标代码,相互进行链接,形成一个完整的可执行程序。

CMake工具就可以完成编译与链接的配置工作,让程序猿可以跨平台编译链接程序

动态库与静态库

静态链接库:包含代码与数据的文件,可在程序 编译期间 链接入程序

动态链接库:包含代码与数据的文件,可在程序执行期间被动态加载

动态链接库有利于 模块/插件 的升级

CMake 文件结构

CMakeList.txt 是整个CMake 工程描述文件,基本内容如下:

#需求的最低CMake 程序版本
cmake_minimum_required(VERSION 3.5)

#本工程的名字
project(</
<think>我们正在使用Qt 6.7.3(通过CMake构建)来实现一个显示地图的QT控件。根据之前的讨论,推荐使用QWebEngineView加载在线地图(如百度地图或高德地图)。以下是具体步骤: ### 1. **配置CMake项目** 首先,确保你的CMake项目文件(CMakeLists.txt)中包含必要的Qt模块,特别是`WebEngineWidgets`。示例配置如下: ```cmake cmake_minimum_required(VERSION 3.16...3.29) project(MyMapApp LANGUAGES CXX) # 查找Qt6库,需要Core, Widgets, WebEngineWidgets find_package(Qt6 REQUIRED COMPONENTS Core Widgets WebEngineWidgets) # 设置自动处理UI文件、资源文件等 set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) # 添加可执行文件 add_executable(MyMapApp main.cpp mainwindow.cpp mainwindow.h mainwindow.ui ) # 链接Qt库 target_link_libraries(MyMapApp PRIVATE Qt6::Core Qt6::Widgets Qt6::WebEngineWidgets ) ``` ### 2. **设计UI界面** 在Qt Designer中: 1. 打开`.ui`文件(例如`mainwindow.ui`) 2. 拖入一个`QWidget`作为容器 3. 右键点击该`QWidget`,选择“提升为...” 4. 在“提升的类名称”中填写`QWebEngineView` 5. 点击“添加”并“提升” ### 3. **在代码中加载地图** 在`mainwindow.cpp`文件中,初始化时加载地图URL: ```cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include <QWebEngineView> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); // 获取提升后的webView控件 QWebEngineView *webView = ui->mapWidget; // 假设在UI中提升的控件对象名为mapWidget // 加载百度地图 webView->load(QUrl("https://map.baidu.com")); } MainWindow::~MainWindow() { delete ui; } ``` ### 4. **处理坐标定位(可选)** 如果需要定位到特定坐标,可以使用百度地图的JavaScript API。首先,准备一个包含API调用的HTML文件: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Baidu Map in Qt</title> <script type="text/javascript" src="https://api.map.baidu.com/api?v=3.0&ak=您的密钥"></script> </head> <body> <div id="mapContainer" style="width:100%;height:100%;"></div> <script> var map = new BMap.Map("mapContainer"); map.centerAndZoom(new BMap.Point(116.404, 39.915), 15); // 初始化中心点 </script> </body> </html> ``` 然后在Qt代码中加载该HTML文件(注意:将HTML文件添加到资源文件中): ```cpp // 加载本地HTML文件 webView->load(QUrl("qrc:/map.html")); ``` ### 5. **Qt与JavaScript交互(高级功能)** 通过`QWebChannel`实现双向通信: ```cpp // 在C++中注册一个对象 QWebChannel *channel = new QWebChannel(webView->page()); webView->page()->setWebChannel(channel); channel->registerObject("qtObject", this); // 将当前对象注册为qtObject // 在HTML的JavaScript中调用: // new QWebChannel(qt.webChannelTransport, function(channel) { // var qtObject = channel.objects.qtObject; // qtObject.someMethod(); // }); ``` ### 注意事项 1. **网络访问权限**:确保应用程序有网络访问权限(特别是在Windows/macOS的防火墙设置中)。 2. **WebGL支持**:如果地图显示异常,检查是否启用了WebGL: ```cpp QWebEngineSettings::defaultSettings()->setAttribute(QWebEngineSettings::WebGLEnabled, true); ``` 3. **坐标系转换**:如果需要将其他坐标(如GPS坐标)转换为百度坐标,需在C++中实现转换算法或调用百度API。 ### 替代方案:使用QtLocation模块 如果希望使用Qt原生地图组件(需要网络支持): ```cmake # 在CMakeLists.txt中添加Location模块 find_package(Qt6 REQUIRED COMPONENTS Location) target_link_libraries(MyMapApp PRIVATE Qt6::Location) ``` 代码示例: ```cpp #include <QGeoServiceProvider> #include <QQuickView> #include <QQmlContext> QQuickView view; view.setSource(QUrl("qrc:/map.qml")); view.show(); ``` 但需要注意:QtLocation在国内地图服务支持有限,通常需要插件支持。 --- ### 常见问题解决 - **页面空白**:检查URL是否正确,或尝试在普通浏览器中打开相同URL。 - **JavaScript不执行**:确保没有跨域问题,且HTML中正确初始化了QWebChannel。 - **内存占用高**:QWebEngineView会占用较多内存,建议在不需要时释放资源。 [参考示例](https://github.com/qt/qtwebengine/tree/dev/examples/webenginewidgets) 提供了更多使用场景。 §§相关问题§§ 1. 如何在Qt中实现百度地图的坐标定位功能? 2. 如何处理不同地图服务商的坐标系差异? 3. 如何优化QT地图组件的内存占用?</think>### 在CMake 6.7.3中实现QT地图控件的解决方案(基于Qt 6.7.3) #### 1. **环境配置(关键步骤)** 在`CMakeLists.txt`中配置WebEngine模块: ```cmake cmake_minimum_required(VERSION 3.16) project(MapApp) # 查找Qt6核心模块 find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets WebEngineWidgets) # 添加可执行文件 add_executable(MapApp main.cpp) # 链接Qt库 target_link_libraries(MapApp PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets Qt6::WebEngineWidgets ) # 启用自动处理机制 set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) ``` > **注意**:确保安装时勾选了`WebEngineWidgets`组件(参考引用[4]的组件列表)[^4] #### 2. **核心实现代码** `main.cpp` 示例: ```cpp #include <QApplication> #include <QMainWindow> #include <QWebEngineView> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建主窗口 QMainWindow mainWindow; mainWindow.resize(1024, 768); // 创建WebEngine视图 QWebEngineView *webView = new QWebEngineView(&mainWindow); mainWindow.setCentralWidget(webView); // 加载地图服务(支持多种地图) const QString mapUrl = "https://map.baidu.com/"; // 百度地图 // "https://www.openstreetmap.org/"; // OpenStreetMap // "https://www.google.com/maps"; // Google地图(需代理) webView->load(QUrl(mapUrl)); // 启用WebGL加速 webView->settings()->setAttribute( QWebEngineSettings::WebGLEnabled, true ); mainWindow.show(); return app.exec(); } ``` #### 3. **坐标系转换处理(关键) 不同地图服务的坐标转换: ```cpp // 在需要定位时调用 void setMapCenter(QWebEngineView *view, double lng, double lat, MapType type) { QString jsCommand; switch(type) { case BaiduMap: // BD-09坐标系 jsCommand = QString("map.centerAndZoom(new BMap.Point(%1, %2), 15);") .arg(lng).arg(lat); break; case AMap: // GCJ-02坐标系 jsCommand = QString("map.setCenter([%1, %2]);") .arg(lng).arg(lat); break; } view->page()->runJavaScript(jsCommand); } ``` #### 4. **离线地图集成 1. **下载瓦片地图**: ```cpp // 使用QNetworkAccessManager下载地图瓦片 void downloadTile(int zoom, int x, int y) { QString url = QString("https://tile.openstreetmap.org/%1/%2/%3.png") .arg(zoom).arg(x).arg(y); QNetworkRequest request(url); manager->get(request); } ``` 2. **本地加载**: ```cpp webView->load(QUrl("file:///path/to/local/map.html")); ``` #### 5. **构建与运行 ```bash mkdir build cd build cmake .. -DCMAKE_PREFIX_PATH=/path/to/Qt/6.7.3/gcc_64 cmake --build . ./MapApp ``` #### 6. **常见问题解决 1. **WebGL初始化失败**: ```cpp // 启动参数添加 QApplication::setAttribute(Qt::AA_UseOpenGLES); ``` 2. **跨域通信问题**: 在HTML中添加: ```html <script src="qrc:///qtwebchannel/qwebchannel.js"></script> <script> new QWebChannel(qt.webChannelTransport, function(channel) { window.qtBridge = channel.objects.qtObject; }); </script> ``` #### 7. **性能优化建议 1. **内存管理**: ```cpp // 释放未使用的资源 webView->page()->setWebChannel(nullptr); webView->page()->settings()->setAttribute( QWebEngineSettings::JavascriptEnabled, false ); ``` 2. **启用硬件加速**: ```cpp QQuickWindow::setSceneGraphBackend(QSGRendererInterface::OpenGL); ``` > **提示**:完整示例可参考Qt官方示例 [QWebEngine Map Example](https://doc.qt.io/qt-6/qtwebengine-webenginewidgets-mapviewer-example.html)[^1] --- ### 坐标系转换参考 | 坐标系类型 | 使用服务 | 转换方法 | |------------|----------------|------------------------------| | WGS-84 | GPS原始数据 | 国际标准 | | GCJ-02 | 高德/腾讯地图 | 需从WGS-84转换 | | BD-09 | 百度地图 | 需从GCJ-02二次转换 [^1] | 转换公式示例: $$ BD-09 = f(GCJ-02) = g(f(WGS-84)) $$ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值