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

本文主要是介绍QGIS开发笔记(三):Windows安装版二次开发环境搭建(下):将QGis融入QtDemo,添加QGis并加载tif遥感图的Demo,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

若该文为原创文章,转载请注明原文出处
本文章博客地址: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<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_DEFINESwin32{# copy ffmpegsrc_file = $$PWD/qgis-ltr/bin/*dst_file = $$OUT_PWD
#    target_file = $$DESTDIRsrc_file ~= s,/,\\,gdst_file ~= s,/,\\,g
#    target_file ~= s,/,\\,gsystem(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_serverHEADERS += \$$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_OBJECTpublic: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安装版二次开发环境搭建(上):安装OSGeo4W运行依赖其Qt的基础环境Demo》
下一篇:敬请期待…


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

这篇关于QGIS开发笔记(三):Windows安装版二次开发环境搭建(下):将QGis融入QtDemo,添加QGis并加载tif遥感图的Demo的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1016174

相关文章

ESP32 esp-idf esp-adf环境安装及.a库创建与编译

简介 ESP32 功能丰富的 Wi-Fi & 蓝牙 MCU, 适用于多样的物联网应用。使用freertos操作系统。 ESP-IDF 官方物联网开发框架。 ESP-ADF 官方音频开发框架。 文档参照 https://espressif-docs.readthedocs-hosted.com/projects/esp-adf/zh-cn/latest/get-started/index

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

一份LLM资源清单围观技术大佬的日常;手把手教你在美国搭建「百万卡」AI数据中心;为啥大模型做不好简单的数学计算? | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 为啥大模型做不好简单的数学计算?从大模型高考数学成绩不及格说起 司南评测体系 OpenCompass 选取 7 个大模型 (6 个开源模型+ GPT-4o),组织参与了 2024 年高考「新课标I卷」的语文、数学、英语考试,然后由经验丰富的判卷老师评判得分。 结果如上图所

UnrealScriptIDE调试环境部署

先安装vs2010   再安装VSIsoShell.exe, 下载地址 https://pan.baidu.com/s/10kPNUuDGTbWXbz7Nos-1WA       fd3t   最后安装unside,下载地址 https://archive.codeplex.com/?p=uside  安装中间有一步选择Binary文件夹要选对路径。   安装好以后,启动 UDKDe

详细分析Springmvc中的@ModelAttribute基本知识(附Demo)

目录 前言1. 注解用法1.1 方法参数1.2 方法1.3 类 2. 注解场景2.1 表单参数2.2 AJAX请求2.3 文件上传 3. 实战4. 总结 前言 将请求参数绑定到模型对象上,或者在请求处理之前添加模型属性 可以在方法参数、方法或者类上使用 一般适用这几种场景: 表单处理:通过 @ModelAttribute 将表单数据绑定到模型对象上预处理逻辑:在请求处理之前

《offer来了》第二章学习笔记

1.集合 Java四种集合:List、Queue、Set和Map 1.1.List:可重复 有序的Collection ArrayList: 基于数组实现,增删慢,查询快,线程不安全 Vector: 基于数组实现,增删慢,查询快,线程安全 LinkedList: 基于双向链实现,增删快,查询慢,线程不安全 1.2.Queue:队列 ArrayBlockingQueue:

问题-windows-VPN不正确关闭导致网页打不开

为什么会发生这类事情呢? 主要原因是关机之前vpn没有关掉导致的。 至于为什么没关掉vpn会导致网页打不开,我猜测是因为vpn建立的链接没被更改。 正确关掉vpn的时候,会把ip链接断掉,如果你不正确关掉,ip链接没有断掉,此时你vpn又是没启动的,没有域名解析,所以就打不开网站。 你可以在打不开网页的时候,把vpn打开,你会发现网络又可以登录了。 方法一 注意:方法一虽然方便,但是可能会有

Windows/macOS/Linux 安装 Redis 和 Redis Desktop Manager 可视化工具

本文所有安装都在macOS High Sierra 10.13.4进行,Windows安装相对容易些,Linux安装与macOS类似,文中会做区分讲解 1. Redis安装 1.下载Redis https://redis.io/download 把下载的源码更名为redis-4.0.9-source,我喜欢跟maven、Tomcat放在一起,就放到/Users/zhan/Documents

加载资源文件失败

背景         自己以前装了一个海康的深度学习算法平台,试用期是一个月,过了一个月之后,因为没有有效注册码或者加密狗的支持了导致无法使用,于是打算卸载掉,在卸载一个软件的时候,无论是使用控制面板还是软件自带的卸载功能,总是卸载不掉,提示“加载资源文件失败”。该软体主要包括以下两部分: 用自带卸载功能卸载的时候分别提示如下:     用控制面板卸载的时候反应很慢,最后也是提示这个