小工具知识网

当前位置: 首页 > 行业知识 > QGIS开发笔记(三):Windows安装版二次开发环境搭建(下):将QGis融入QtDemo,添加QGis并加载tif遥感图的Demo

行业知识

QGIS开发笔记(三):Windows安装版二次开发环境搭建(下):将QGis融入QtDemo,添加QGis并加载tif遥感图的Demo

2026-11-08 01:16:26 来源:互联网转载

若该文为原创文章,转载请注明原文出处

本文章博客地址:https://hpzwl.blog.csdn.net/article/details/139136356

长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…

Qt开发专栏:三方库开发技术

上一篇:《QGIS开发笔记(二):Windows安装版二次开发环境搭建(上):安装OSGeo4W运行依赖其Qt的基础环境Demo》

下一篇:敬请期待…

前言

  使用QGis的目的是进行二次开发,或者说是融入我们的应用(无人车、无人船、无人机),本片描述搭建QGis二次基础开发环境,由于实在是太长了,进行了分篇:

  • 上半部分:主要是安装好后,使用QtCreator可以使用QGIs的apps下的Qt使用对应的编译器编译不带qgis的空工程。
  • 下半部分:在上半部分基础上添加qgis的依赖,并实现一个qgis的完全独立模模块化的应用,让没有安装qgis库的使用工程模板可以开始二次开发编译。

    Demo

      空demo

      

      运行qgis的demo

      

      运行包下载地址:https://download.csdn.net/download/qq21497936/89373948

    给Demo引入QGIS库

    步骤一:添加qgis代码

      新建QWidget的子类TestWidget,使用常规initControl添加布局嵌套窗口方式,来实现在QApplication消息循环里面的窗口类里面添加单独的qgis窗口。

      

    void TestWidget::testEnv(QString filePath){    QHBoxLayout *pHBoxLayout = dynamic_cast(this->layout());    if(!pHBoxLayout)    {        pHBoxLayout = new QHBoxLayout(this);        LOG;    }    QgsMapCanvas *pMapCanvas = new QgsMapCanvas();    // 本地影像路径    QgsRasterLayer *pLayer = new QgsRasterLayer(filePath);    pMapCanvas->setLayers({pLayer});    pMapCanvas->setExtent(pLayer->extent());    pMapCanvas->refresh();    QgsMapToolPan *pMapToolPan = new QgsMapToolPan(pMapCanvas);    pMapCanvas->setMapTool(pMapToolPan);    pHBoxLayout->addWidget(pMapCanvas, 1);    pMapCanvas->show();    setLayout(pHBoxLayout);}

    步骤二:新建模块,并引入基本的qgis库

      

      

      然后开始编译。

    步骤三:新增支持c++17配置

      编译出错如下:

      

       支持c++17

      

    步骤四:支持数学宏定义

      

      未定义M_Pi添加

      

      最终,添加了win32下自动copy的脚本

      

    步骤五:运行奔溃寻找依赖库

      编译通过,但是运行崩溃,这里不好直接把bin全部copy过来,所以用打包的方式确定少了那些库,补充一个打包环境:

      

      

      这个打包之后,像Qt5Xml.dll也没有包含进去,但是实际apps/qt5/bin下是有的,这个只能说单独弄sdk不是 很完善,目前靠个人完善。

      完善之后发现:

      

      基本就是OSGeo4W/bin下大部分库和OSGeo4W/apps/Qt5/bin下大部分库了:

      

      没有添加Qgis代码,添加之后还少qgis_gui.dll,apps下qgis-lts中bin的dll(就qgis的直接库),所以后来干脆直接三个bin目录下下的dll都拷贝了,需要精简再反向减少即可。

      

    关键代码

    qgis3.34.7env.pri

    INCLUDEPATH += $$PWDDEPENDPATH += $$PWD# 需要QDomDocumentQT += xml# 需要支持c++17CONFIG += c++17# 未定义M_PI、M_PI_2添加DEFINES += _USE_MATH_DEFINESwin32{    # copy ffmpeg    src_file = $$PWD/qgis-ltr/bin/*    dst_file = $$OUT_PWD#    target_file = $$DESTDIR    src_file ~= s,/,\,g    dst_file ~= s,/,\,g#    target_file ~= s,/,\,g    system(xcopy $$src_file $$dst_file /y /s/q/e)#    system(xcopy $$src_file $$target_file /y /s/q/e)}INCLUDEPATH += $$PWD/qgis-ltr/includeLIBS += -L$$PWD/qgis-ltr/lib \        -lqgis_3d \        -lqgis_analysis \        -lqgis_app \        -lqgis_core \        -lqgis_gui \        -lqgis_native \        -lqgis_serverHEADERS += \    $$PWD/qgis3.34.7.h

    qgis3.34.7.h

    #ifndef QGIS3_34_7_H#define QGIS3_34_7_H#include #include #include #include #include #endif // QGIS3_34_7_HTestWidget.cpp#include "TestWidget.h"#include "ui_TestWidget.h"#include #include #include #include "qgis3.34.7.h"// QtCreator在msvc下设置编码也或有一些乱码,直接一刀切,避免繁琐的设置#define MSVC#ifdef MSVC#define QSTRING(s)  QString::fromLocal8Bit(s)#else#define QSTRING(s)  QString(s)#endif#include #include //#define LOG qDebug()class TestWidget;}class TestWidget : public QWidget{    Q_OBJECTpublic:    explicit TestWidget(QWidget *parent = 0);    ~TestWidget();public:    void testEnv(QString filePath);protected:    void initControl();private:    Ui::TestWidget *ui;};#endif // TESTWIDGET_H    ui-setupUi(this);    QString version = "v1.0.0";    setWindowTitle(QSTRING("QGisDemo %1(作者:长沙创微智科信息技术有限公司 QQ:21497936 WX:15173255813 www.chuangweizhike.com)").arg(version));    initControl();}TestWidget::~TestWidget(){    delete ui;}void TestWidget::initControl(){}void TestWidget::testEnv(QString filePath){    QHBoxLayout *pHBoxLayout = dynamic_cast        pHBoxLayout = new QHBoxLayout(this);        LOG;    }    QgsMapCanvas *pMapCanvas = new QgsMapCanvas();    // 本地影像路径    QgsRasterLayer *pLayer = new QgsRasterLayer(filePath);    pMapCanvas-setLayers({pLayer});    pMapCanvas-setExtent(pLayer-extent());    pMapCanvas-refresh();    QgsMapToolPan *pMapToolPan = new QgsMapToolPan(pMapCanvas);    pMapCanvas-setMapTool(pMapToolPan);    pHBoxLayout-addWidget(pMapCanvas, 1);    pMapCanvas-show();    setLayout(pHBoxLayout);}

上一篇:地铁社区服务器怎么进入?

下一篇:杰奇区块添加秘籍,一步步教你轻松掌握!