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

这篇具有很好参考价值的文章主要介绍了Qt下开发基于QGIS的应用程序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目的

由于有在背景地图上进行动态轨迹(曲线)显示的需要,故采用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下开发基于QGIS的应用程序,qt,开发语言
全部next后到Select Components,具体按照下面两张图进行组件选择:
Qt下开发基于QGIS的应用程序,qt,开发语言
Qt下开发基于QGIS的应用程序,qt,开发语言
之后全部按next,直到等待安装完成。

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

Visual Studio Installer可以提供这两个东西的下载。百度官网就能下载Visual Studio Installer
具体的安装选择只需要下图所示的3个勾,其余的都可以取消。
Qt下开发基于QGIS的应用程序,qt,开发语言

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

在 官网下载OSGeo4W network installer。
Qt下开发基于QGIS的应用程序,qt,开发语言
下载后运行
Qt下开发基于QGIS的应用程序,qt,开发语言
Qt下开发基于QGIS的应用程序,qt,开发语言
Qt下开发基于QGIS的应用程序,qt,开发语言
Qt下开发基于QGIS的应用程序,qt,开发语言
这里选择Direct Connection
Qt下开发基于QGIS的应用程序,qt,开发语言
这里选择download.osgeo.org
Qt下开发基于QGIS的应用程序,qt,开发语言
搜素栏输入qgis
Qt下开发基于QGIS的应用程序,qt,开发语言
点击Libs后的小圈,变成Install
Qt下开发基于QGIS的应用程序,qt,开发语言
一直点击下一步,就可以开始下载了
Qt下开发基于QGIS的应用程序,qt,开发语言
但是下载速度一般是比较慢的。所以还是推荐直接下载其他人下载好的压缩包。

下载解压后的文件组成如下图:
Qt下开发基于QGIS的应用程序,qt,开发语言

4、环境搭建

运行Qt Creator
Qt下开发基于QGIS的应用程序,qt,开发语言
新建工程后,双击Qt Widgets Application
Qt下开发基于QGIS的应用程序,qt,开发语言
Qt下开发基于QGIS的应用程序,qt,开发语言
一直下一步,直到Kit Selection,可以只选择MSVC2015

Qt下开发基于QGIS的应用程序,qt,开发语言
完成后如下图
Qt下开发基于QGIS的应用程序,qt,开发语言
左下角选择Release,编译运行,成功显示空白窗口
Qt下开发基于QGIS的应用程序,qt,开发语言
工程文件夹里出现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从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文件夹
Qt下开发基于QGIS的应用程序,qt,开发语言
拷贝OSGeo4W64\apps\Qt5\bin目录下全部dll到exe目录(在工程文件的release文件夹下)下。
Qt下开发基于QGIS的应用程序,qt,开发语言
拷贝OSGeo4W64\apps\Qt5\plugins 目录下的platforms目录到exe目录下plugins目录(自己新建)里。
Qt下开发基于QGIS的应用程序,qt,开发语言
拷贝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写完之后换个拓展名就可。
Qt下开发基于QGIS的应用程序,qt,开发语言
Qt下开发基于QGIS的应用程序,qt,开发语言
到此为止,文件移动完毕.
下面打开工程,修改pro文件
Qt下开发基于QGIS的应用程序,qt,开发语言
其中有关文件夹位置根据自己下载的情况进行修改
修改main函数
Qt下开发基于QGIS的应用程序,qt,开发语言
刚开始修改会显示找不到qgsapplication.h文件,那是因为还没有编译pro文件,直接编译运行就可以了。

修改mainwindow.h文件
Qt下开发基于QGIS的应用程序,qt,开发语言
修改mainwindow.cpp文件
Qt下开发基于QGIS的应用程序,qt,开发语言
在左下角选择构建Release版本,编译运行,显示绿幕,Qgis开发环境已成功搭建。
Qt下开发基于QGIS的应用程序,qt,开发语言

6、展示网页地图

双击mainwindow.ui,进行ui设计
Qt下开发基于QGIS的应用程序,qt,开发语言
右键画布,点击添加工具栏
点击画布左下角新建动作,设定对象名称为actshowmap
Qt下开发基于QGIS的应用程序,qt,开发语言
点击OK,发现Action Editor框内多出一栏动作,将其拖拽至上方工具栏处,发现下面使用那里已经打勾,说明动作已成功导入工具栏。

新建动作“退出”,重复上面操作
Qt下开发基于QGIS的应用程序,qt,开发语言
点击下方signals and slots editor,点击绿色加号,如下图选择栏目
Qt下开发基于QGIS的应用程序,qt,开发语言
编译运行,成功展示出工具栏,点击退出也可实现退出,说明成功实现工具栏动作。

下面进行展示地图的代码实现。
在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,将这两个文件复制进去
Qt下开发基于QGIS的应用程序,qt,开发语言
在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;
}

再次编译运行,按键功能正常,成功显示地图
Qt下开发基于QGIS的应用程序,qt,开发语言文章来源地址https://www.toymoban.com/news/detail-630474.html

到了这里,关于Qt下开发基于QGIS的应用程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 基于Qt HTTP应用程序项目案例

    main函数创建对象空间,确认窗口的大小和坐标。

    2024年02月07日
    浏览(11)
  • 16-4_Qt 5.9 C++开发指南_Qt 应用程序的发布

    用 Qt 开发一个应用程序后,将应用程序提供给用户在其他计算机上使用就是应用程序的发布。应用程序发布一般会提供一个安装程序,将应用程序的可执行文件及需要的运行库安装到用户计算机上,即使用户计算机上没有安装 Qt 也能正常运行安装的程序。 Qt的应用程序发布

    2024年02月14日
    浏览(31)
  • C++QT教程3——手册4.11.1自带教程(笔记)——创建一个基于Qt Widget的应用程序

    C++QT教程3——手册4.11.1自带教程(笔记)——创建一个基于Qt Widget的应用程序

    本教程介绍如何使用Qt Creator创建一个小型Qt应用程序,名为Text Finder。它是Qt UI工具中Text Finder示例的简化版本。应用程序的用户界面是使用Qt Designer通过Qt小部件构建的。应用程序逻辑是通过使用代码编辑器编写的C++代码。 选择文件 新建文件或项目 应用程序 Qt Widgets应用程序

    2024年02月13日
    浏览(5)
  • 掷骰子的多线程应用程序2基于互斥量的线程同步(复现《Qt C++6.0》)

    掷骰子的多线程应用程序2基于互斥量的线程同步(复现《Qt C++6.0》)

    说明:在复现过程中出现两点问题(1)run()函数中对m_diceValued的赋值(2)do_timeOut()函数中没有对m_seq、m_diceValued进行定义。修改后的复现程序如下所示: 主线程: .h .cpp 工作线程: .h .cpp

    2024年02月07日
    浏览(17)
  • 06-3_Qt 5.9 C++开发指南_多窗体应用程序的设计(主要的窗体类及其用途;窗体类重要特性设置;多窗口应用程序设计)

    06-3_Qt 5.9 C++开发指南_多窗体应用程序的设计(主要的窗体类及其用途;窗体类重要特性设置;多窗口应用程序设计)

    常用的窗体基类是QWidget、QDialog 和QMainWindow,在创建 GUI应用程序时选择窗体基类就是从这 3 个类中选择。QWidget 直接继承于 QObject,是 QDialog 和 QMainWindow 的父类,其他继承于 QWidget 的窗体类还有 QSplashScreen、QMdiSubWindow和QDesktopWidget。另外还有一个类QWindow,它同时从 QObject 和Q

    2024年02月13日
    浏览(8)
  • 基于Qt、PYTHON智能校园防御系统应用程序,实现了摄像头数据采集、人脸识别、口罩识别、 数据统计等功能

    基于Qt、PYTHON智能校园防御系统应用程序,实现了摄像头数据采集、人脸识别、口罩识别、 数据统计等功能

    完整项目地址:https://download.csdn.net/download/lijunhcn/88453470 项目结构 环境选型 语言:Python 操作系统:Windows 数据库:MySQL 窗口界面:PyQT API接口:百度AI接口,用以实现人脸登陆与注册 远程MySQL表结构 远程表结构sql脚本 项目背景 智能校园防御软件是实现了一款基于摄像头数据

    2024年02月03日
    浏览(10)
  • 毕设项目——基于Qt、PYTHON智能校园防御系统应用程序,实现了摄像头数据采集、人脸识别、口罩识别、 数据统计等功能

    毕设项目——基于Qt、PYTHON智能校园防御系统应用程序,实现了摄像头数据采集、人脸识别、口罩识别、 数据统计等功能

    完整项目地址:https://download.csdn.net/download/lijunhcn/88453470 项目结构 环境选型 语言:Python 操作系统:Windows 数据库:MySQL 窗口界面:PyQT API接口:百度AI接口,用以实现人脸登陆与注册 远程MySQL表结构 远程表结构sql脚本 项目背景 智能校园防御软件是实现了一款基于摄像头数据

    2024年02月04日
    浏览(5)
  • 【QT】MDI应用程序设计

    【QT】MDI应用程序设计

    目录 1 MDI简介 2 文档窗口类QFormDoc的设计 3 MDI主窗口设计与子窗口的使用 3.1 主窗口界面设计 3.2 MDI子窗口的创建与加入 3.3 QMdiArea常用功能函数 3.4 MDI的信号         传统的应用程序设计中有多文档界面(Multi-documentInterface,MDI)应用程序,Qt为设计 MDI应用程序提供了支持。

    2024年01月25日
    浏览(9)
  • 【QT】多窗体应用程序设计

    【QT】多窗体应用程序设计

    目录 1主要的窗体类及其用途 2 窗体类重要特性的设置 2.1 setAttribute()函数 2.2 setWindowFlags()函数 2.3 setWindowState()函数 2.4 setWindowModality()函数 2.5 setWindowOpacity()函数 3 多窗口应用程序的设计 3.1 主窗口设计 3.2 QFormDoc类的设计 3.3 QFormDoc类的使用 3.4 QFormTable类的设计 3.5 QFormTable类的使

    2024年01月18日
    浏览(8)
  • Qt 实现应用程序单实例

    目前使 Qt 运行一个实例有如下几种方式: 1.QSharedMemory 使用共享内存,当第二个进程启动时,判断内存区数据是否建立,如有,则退出;这种方式有弊端,在程序发生崩溃时,未及时清除共享区数据,导致程序不能正常启动。 2.文件锁 在程序运行的时候就在目录下创建一个文

    2024年02月10日
    浏览(3)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包