gpt4 book ai didi

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

转载 作者:撒哈拉 更新时间:2024-05-29 17:05:15 67 4
gpt4 key购买 nike

前言

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

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

Demo

  空demo    。

  运行qgis的demo    。

 

给Demo引入QGIS库

步骤一:添加qgis代码

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

void TestWidget::testEnv(QString filePath) { QHBoxLayout *pHBoxLayout = dynamic_cast<QHBoxLayout *>(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 += $$PWD DEPENDPATH += $$PWD # 需要QDomDocument QT += xml # 需要支持c++17 CONFIG += c++17 # 未定义M_PI、M_PI_2添加 DEFINES += _USE_MATH_DEFINES win32{ # 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/include LIBS += -L$$PWD/qgis-ltr/lib \ -lqgis_3d \ -lqgis_analysis \ -lqgis_app \ -lqgis_core \ -lqgis_gui \ -lqgis_native \ -lqgis_server HEADERS += \ $$PWD/qgis3.34.7.h 

qgis3.34.7.h

#ifndef QGIS3_34_7_H #define QGIS3_34_7_H #include <qgsapplication.h> #include <qgsmapcanvas.h> #include <qgsmaptoolpan.h> #include <qgsrasterlayer.h> #include <QtMath> #endif // QGIS3_34_7_H TestWidget.cpp #include "TestWidget.h" #include "ui_TestWidget.h" #include <QHBoxLayout> #include <QBoxLayout> #include <QPushButton> #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 <QDebug> #include <QDateTime> //#define LOG qDebug()<<__FILE__<<__LINE__ //#define LOG qDebug()<<__FILE__<<__LINE__<<__FUNCTION__ //#define LOG qDebug()<<__FILE__<<__LINE__<<QThread()::currentThread() //#define LOG qDebug()<<__FILE__<<__LINE__<<QDateTime::currentDateTime().toString("yyyy-MM-dd") #define LOG qDebug()<<__FILE__<<__LINE__<<QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz") 

TestWidget.h

#ifndef TESTWIDGET_H #define TESTWIDGET_H #include <QWidget> namespace Ui { class TestWidget; } class TestWidget : public QWidget { Q_OBJECT public: explicit TestWidget(QWidget *parent = 0); ~TestWidget(); public: void testEnv(QString filePath); protected: void initControl(); private: Ui::TestWidget *ui; }; #endif // TESTWIDGET_H 

TestWidget.cpp

TestWidget::TestWidget(QWidget *parent) : QWidget(parent), ui(new Ui::TestWidget) { 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<QHBoxLayout *>(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); } 
 

模块化

  在这里插入图片描述

 

工程模板v1.0.0

  在这里插入图片描述

 

入坑

入坑一:无法加载tif图像

问题

  在这里插入图片描述

过程

  开始以为是无法直接在QWidget加载,可以在QMainWindow里面加载,后来经过判断是因为变量的问题,在main函数里面是因为是全局的,所以exec()之后是存在的,而放到Qt窗口构造里面,则是new出来的就可以,简单来说就是保持对象存在.

解决

  局部改成new即可:    。

最后此篇关于QGIS开发笔记(三):Windows安装版二次开发环境搭建(下):将QGis融入QtDemo,添加QGis并加载tif遥感图的Demo的文章就讲到这里了,如果你想了解更多关于QGIS开发笔记(三):Windows安装版二次开发环境搭建(下):将QGis融入QtDemo,添加QGis并加载tif遥感图的Demo的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

67 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com