Qt下开发基于QGIS的应用程序

本文介绍了采用Qt+QGIS方案在背景地图上显示动态轨迹的开发过程。包括Qt、MSVC套件、Windows 10 SDK及QGIS开发库文件的下载安装,环境搭建过程中遇到的问题及解决方法,QGIS开发环境的搭建,以及最终实现网页地图的展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目的

由于有在背景地图上进行动态轨迹(曲线)显示的需要,故采用Qt+QGIS的方案!

版本说明

Qt5.12.12,VS2015编译器,QGIS3.10.1。
在配置之前,电脑是新装机的系统,没有任何相关软件版本。

1、Qt的安装

Qt官网(https://download.qt.io/)或国内镜像网站(https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt)或网络搜索下载Qt5.12.12安装包。

下载完成进入安装,如下图,首先需要进行账号的注册。
Qt安装
全部next后到Select Components,具体按照下面两张图进行组件选择:
组件选择
组件选择2
之后全部按next,直到等待安装完成。

2、MSVC套件与Windows 10 SDK的下载

Visual Studio Installer可以提供这两个东西的下载。百度官网就能下载Visual Studio Installer
具体的安装选择只需要下图所示的3个勾,其余的都可以取消。
安装MSVC套件

3、QGIS开发有关的库文件下载

官网下载OSGeo4W network installer。
在这里插入图片描述
下载后运行
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里选择Direct Connection
在这里插入图片描述
这里选择download.osgeo.org
在这里插入图片描述
搜素栏输入qgis
在这里插入图片描述
点击Libs后的小圈,变成Install
在这里插入图片描述
一直点击下一步,就可以开始下载了
在这里插入图片描述
但是下载速度一般是比较慢的。所以还是推荐直接下载其他人下载好的压缩包。

下载解压后的文件组成如下图:
在这里插入图片描述

4、环境搭建

运行Qt Creator
在这里插入图片描述
新建工程后,双击Qt Widgets Application
在这里插入图片描述
在这里插入图片描述
一直下一步,直到Kit Selection,可以只选择MSVC2015

在这里插入图片描述
完成后如下图
在这里插入图片描述
左下角选择Release,编译运行,成功显示空白窗口
在这里插入图片描述
工程文件夹里出现build-test_1-Desktop_Qt_5_12_12_MSVC2015_64bit-Release文件夹。
到此为止,已经可以成功在Qt中使用MSVC编译器

这个过程中,有可能无法运行rc.exe的编译错误,把C:\Program Files (x86)\Windows Kits\10\bin\10.0.20348.0\x64文件夹下的rc.exe、rcdll.dll文件拷贝到C:\Qt\Qt5.12.12\5.12.12\msvc2015_64\bin下即可。

还有可能出现的问题,运行时会提示:

Starting E:\QTex\build-untitled-Desktop_Qt_5_12_12_MSVC2015_64bit-Debug\debug\untitled.exe …
程序异常结束。
The process was ended forcefully.
E:\QTex\build-untitled-Desktop_Qt_5_12_12_MSVC2015_64bit-Debug\debug\untitled.exe crashed.

这是少了动态链接库
可以直接双击E:\QTex\build-untitled-Desktop_Qt_5_12_12_MSVC2015_64bit-Debug\debug\untitled.exe运行,会提示具体缺少哪些动态库,直接从电脑上找到拷贝过来即可。具体地“

把vcruntime140d.dll和msvcp140d.dll
从C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\redist\debug_nonredist\x64\Microsoft.VC140.DebugCRT
拷贝到C:\Qt\Qt5.12.12\5.12.12\msvc2015_64\bin下即可。

或者,最简单的方法是把动态库所在路径添加到系统环境变量中去。这里例子中,在系统环境变量PATH中增加以下两条路径:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\redist\debug_nonredist\x64\Microsoft.VC140.DebugCRT
C:\Qt\Qt5.12.12\5.12.12\msvc2015_64\bin

下面进行Qgis开发环境搭建。

5、QGIS开发环境搭建

注意:在Qt下开发QGIS程序时,都是构建Release版本。记得在Qt左下角选构建Release。

打开OSGeo4W64文件夹
在这里插入图片描述
拷贝OSGeo4W64\apps\Qt5\bin目录下全部dll到exe目录(在工程文件的release文件夹下)下。
在这里插入图片描述
拷贝OSGeo4W64\apps\Qt5\plugins 目录下的platforms目录到exe目录下plugins目录(自己新建)里。
在这里插入图片描述
拷贝OSGeo4W64\apps\qgis-ltr\bin 目录下全部文件考到exe目录下。
拷贝OSGeo4W64\bin 目录下全部dll文件和gdalplugins目录考到exe目录下。
把OSGeo4W64\apps\qgis-ltr\plugins目录下全部文件考到exe同级plugins目录下。
拷贝OSGeo4W64\share 中gdal目录到exe同级的share目录下(自己新建)。
在exe目录下新建一个qt.conf文件,填写如下内容,用txt写完之后换个拓展名就可。
在这里插入图片描述
在这里插入图片描述
到此为止,文件移动完毕.
下面打开工程,修改pro文件
在这里插入图片描述
其中有关文件夹位置根据自己下载的情况进行修改
修改main函数
在这里插入图片描述
刚开始修改会显示找不到qgsapplication.h文件,那是因为还没有编译pro文件,直接编译运行就可以了。

修改mainwindow.h文件
在这里插入图片描述
修改mainwindow.cpp文件
在这里插入图片描述
在左下角选择构建Release版本,编译运行,显示绿幕,Qgis开发环境已成功搭建。
在这里插入图片描述

6、展示网页地图

双击mainwindow.ui,进行ui设计
在这里插入图片描述
右键画布,点击添加工具栏
点击画布左下角新建动作,设定对象名称为actshowmap
在这里插入图片描述
点击OK,发现Action Editor框内多出一栏动作,将其拖拽至上方工具栏处,发现下面使用那里已经打勾,说明动作已成功导入工具栏。

新建动作“退出”,重复上面操作
在这里插入图片描述
点击下方signals and slots editor,点击绿色加号,如下图选择栏目
在这里插入图片描述
编译运行,成功展示出工具栏,点击退出也可实现退出,说明成功实现工具栏动作。

下面进行展示地图的代码实现。
在mainwindow.h文件中,定义函数addLayers(),定义图层集mapLayerSet,添加头文件,如下

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include<QtMath>
#include <QMainWindow>
#include <qgsmapcanvas.h>
#include <QList>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

public slots:
    void addLayers();

private:
    Ui::MainWindow *ui;
    QgsMapCanvas* mapCanvas;
    QList <QgsMapLayer*>  mapLayerSet;
};
#endif // MAINWINDOW_H

在mainwindow.cpp文件中写addLayer(),这里添加的是栅格图层,如下

void MainWindow::addLayers()
{
    QgsRasterLayer* rasterLayer = 0;
    auto url = QString("http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x=105&y=48&z=7");
    rasterLayer= new QgsRasterLayer(url);
    if ( !rasterLayer->isValid() )
    {
        QMessageBox::critical( this, "error","layer is invalid" );
        return;
    }
    QgsProject::instance()->addMapLayer(rasterLayer);
    mapLayerSet.append( rasterLayer );
    mapCanvas->setExtent( rasterLayer->extent() );
    mapCanvas->setLayers( mapLayerSet );
    mapCanvas->setVisible( true );
    mapCanvas->freeze( false );
    mapCanvas->refresh();
}

图层url选择的是
http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x=105&y=48&z=7
添加头文件:

#include <qgsrasterlayer.h>
#include <QMessageBox>
#include <qgsproject.h>

如果之前环境搭建好了,这里应该是不会显示找不到文件的

最后添加显示地图按键的connect,如下:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    mapCanvas = new QgsMapCanvas();
    this->setCentralWidget(mapCanvas);
    mapCanvas->enableAntiAliasing(true);
    mapCanvas->setCanvasColor( QColor(0, 255, 0));
    mapCanvas->setVisible(true);

    connect( ui->actshowmap, SIGNAL( triggered() ), this, SLOT( addLayers() ) );
}

编译运行,发现点击展示地图按钮没有反应,在下方应用程序输出栏可以看见原因是
Cannot find proj.db
使用everthing搜素文件proj.db和proj.lib,在exe目录新建文件夹proj,将这两个文件复制进去
在这里插入图片描述
在main函数中添加路径

#include "mainwindow.h"

#include <QApplication>
#include <QtMath>
#include "qgsapplication.h"

int main(int argc, char *argv[])
{
    QDir dir;
    QString PROJ_LIB_PATH = dir.currentPath() + "/proj";
    qputenv("PROJ_LIB",PROJ_LIB_PATH.toLatin1());

    QString PROJ_DB_PATH = dir.currentPath() + "/proj";
    qputenv("PROJ_DB",PROJ_DB_PATH.toLatin1());

    QgsApplication app(argc, argv, true, QString());
    MainWindow *pMainWindow = new MainWindow(0);
    pMainWindow->show();
    app.setActiveWindow(pMainWindow);
    int iRet = app.exec();
    delete pMainWindow;
    return iRet;
}

再次编译运行,按键功能正常,成功显示地图
在这里插入图片描述

### 解决方案 在 Visual Studio (VS) 中进行 QGIS 的二次开发时,“无法定位程序输入点于动态链接库”的错误通常是由以下几个原因之一引起的: 1. **依赖项缺失或路径配置不正确** 如果某些必要的 DLL 文件未被加载或者其路径未正确定位,则可能导致此问题。例如,在 Windows 平台上,QGIS 需要多个第三方库的支持,这些库的路径需要正确设置到系统的环境变量 `PATH` 或者项目中的附加依赖项中[^1]。 2. **版本冲突** 使用的不同版本的 Qt、GDAL 或其他依赖库可能与 QGIS 所需的版本存在冲突。这会导致函数签名或其他接口定义上的差异,从而引发上述错误[^4]。 3. **编译器选项不匹配** 编译器的选择(如 MSVC 和 MinGW)以及编译参数(如调试模式 vs 发布模式)如果不一致也可能导致此类问题。这是因为不同编译器生成的目标文件之间可能存在 ABI 不兼容的情况[^2]。 以下是具体的解决方案: #### 1. 确认并修复依赖关系 确保所有的必要库都已安装,并将其路径加入到项目的构建环境中。对于 QGIS 开发而言,常见的依赖库包括但不限于: - GDAL/OGR 库 - GEOS 几何引擎 - PROJ 投影转换工具 - SQLite 数据库支持 - PyQt/Qt GUI 工具包 可以参考以下路径来确认是否有遗漏的库文件: ```plaintext D:\QGIS\osgeo4w-qgis-dev\3rdParty\lib D:\QGIS\osgeo4w-qgis-dev\QT5\lib D:\QGIS\osgeo4w-qgis-dev\QGIS-ltr\lib ``` 如果发现缺少特定的 `.dll` 文件,可以从官方资源下载相应版本并放置到指定位置。 #### 2. 设置正确的环境变量 将所有必需的动态链接库所在的目录添加至操作系统的全局 PATH 变量中。这样可以让运行时自动找到所需的入口点而无需手动干预。具体方法如下所示: ```cmd set PATH=D:\QGIS\osgeo4w-qgis-dev\bin;%PATH% ``` 另外还需注意的是,有时即使设置了本地工程属性里的 Library Directories 参数也不足以解决问题;此时就需要借助外部手段强制注入所需模块的位置信息[^3]。 #### 3. 统一使用的框架和技术栈 为了避免潜在的技术堆栈混搭带来的麻烦,请始终遵循官方文档推荐的最佳实践指南来进行插件编写工作流程设计。比如坚持采用同一套标准API调用方式而不是混合多种风格的做法等等。 最后附上一段简单的C++代码片段用于演示如何创建基本的QgsApplication实例对象以便后续扩展功能实现更多业务逻辑处理需求: ```cpp #include <qgsapplication.h> int main(int argc, char *argv[]) { QgsApplication app(argc, argv); // Initialize resources and other settings here... } ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值