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

2024-06-15 1666阅读

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

    • 目的
    • 版本说明
    • 1、Qt的安装
    • 2、MSVC套件与Windows 10 SDK的下载
    • 3、QGIS开发有关的库文件下载
    • 4、环境搭建
    • 5、QGIS开发环境搭建
    • 6、展示网页地图

      目的

      由于有在背景地图上进行动态轨迹(曲线)显示的需要,故采用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的应用程序

      全部next后到Select Components,具体按照下面两张图进行组件选择:

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

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

      之后全部按next,直到等待安装完成。

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

      Visual Studio Installer可以提供这两个东西的下载。百度官网就能下载Visual Studio Installer

      具体的安装选择只需要下图所示的3个勾,其余的都可以取消。

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

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

      在 官网下载OSGeo4W network installer。

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

      下载后运行

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

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

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

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

      这里选择Direct Connection

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

      这里选择download.osgeo.org

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

      搜素栏输入qgis

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

      点击Libs后的小圈,变成Install

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

      一直点击下一步,就可以开始下载了

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

      但是下载速度一般是比较慢的。所以还是推荐直接下载其他人下载好的压缩包。

      下载解压后的文件组成如下图:

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

      4、环境搭建

      运行Qt Creator

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

      新建工程后,双击Qt Widgets Application

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

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

      一直下一步,直到Kit Selection,可以只选择MSVC2015

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

      完成后如下图

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

      左下角选择Release,编译运行,成功显示空白窗口

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

      工程文件夹里出现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文件夹

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

      拷贝OSGeo4W64\apps\Qt5\bin目录下全部dll到exe目录(在工程文件的release文件夹下)下。

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

      拷贝OSGeo4W64\apps\Qt5\plugins 目录下的platforms目录到exe目录下plugins目录(自己新建)里。

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

      拷贝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下开发基于QGIS的应用程序

      到此为止,文件移动完毕.

      下面打开工程,修改pro文件

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

      其中有关文件夹位置根据自己下载的情况进行修改

      修改main函数

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

      刚开始修改会显示找不到qgsapplication.h文件,那是因为还没有编译pro文件,直接编译运行就可以了。

      修改mainwindow.h文件

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

      修改mainwindow.cpp文件

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

      在左下角选择构建Release版本,编译运行,显示绿幕,Qgis开发环境已成功搭建。

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

      6、展示网页地图

      双击mainwindow.ui,进行ui设计

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

      右键画布,点击添加工具栏

      点击画布左下角新建动作,设定对象名称为actshowmap

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

      点击OK,发现Action Editor框内多出一栏动作,将其拖拽至上方工具栏处,发现下面使用那里已经打勾,说明动作已成功导入工具栏。

      新建动作“退出”,重复上面操作

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

      点击下方signals and slots editor,点击绿色加号,如下图选择栏目

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

      编译运行,成功展示出工具栏,点击退出也可实现退出,说明成功实现工具栏动作。

      下面进行展示地图的代码实现。

      在mainwindow.h文件中,定义函数addLayers(),定义图层集mapLayerSet,添加头文件,如下

      #ifndef MAINWINDOW_H
      #define MAINWINDOW_H
      #include
      #include 
      #include 
      #include 
      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   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 
      #include 
      #include 
      

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

      最后添加显示地图按键的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的应用程序

      在main函数中添加路径

      #include "mainwindow.h"
      #include 
      #include 
      #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的应用程序

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]