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_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安装版二次开发环境搭建(上):安装OSGeo4W运行依赖其Qt的基础环境Demo》
下一篇:敬请期待…


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/661969.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis-事务

简介 说到事务&#xff0c;一般都会第一时间的想到MySQL的事务。 在MySQL中事务的提出是为了解决解决原子性操作的&#xff0c;一组执行命令要么全部执行成功&#xff0c;要么执行失败进行回滚&#xff0c;一条也不执行。 在Redis中也有事务这个概念&#xff0c;但与MySQL相…

Windows内核函数 - 添加、修改注册表键值

打开注册表的句柄后&#xff0c;就可以对该项进行设置和修改了。注册表是以二元形式存储的&#xff0c;即“键名”和“键值”。通过键名设置键值&#xff0c;而键值可以划分几个类&#xff0c;如下表所示。 表1 键值的分类 在添加和修改注册表键值的时候&#xff0c;要分类进行…

非线性优化:高斯-牛顿法的原理与实现

非线性优化&#xff1a;高斯-牛顿法的原理与实现 引言 在实际应用中&#xff0c;很多问题都是非线性的。非线性优化问题广泛应用于机器学习、数据拟合、工程设计等领域。高斯-牛顿法是一种常用于解决非线性最小二乘问题的迭代算法。本文将详细介绍高斯-牛顿法的原理、推导过程…

重磅发布,2024精选《制造业商业智能BI最佳实践合集 》

在数字时代&#xff0c;中国制造业正面临着前所未有的深刻变革。 商业环境的复杂性与多变性、全球化竞争的激烈程度、消费需求的快速演变&#xff0c;以及新技术的持续进步等多种因素共同推动着制造企业积极加入数字化转型的潮流。 在这个转型的过程中&#xff0c;转型的速度…

超好用的加密工具

超好用的加密工具 背景 介于行业原因经常要对相关文件进行加密传输&#xff0c;尽可能避免文件的泄漏&#xff0c;保护群众的隐私。于是我就开发了一个非常好用的加密工具。 环境 本工具目前只适用 Windows 操作系统,最好是Windows8以上&#xff0c;否则需要下载额外的依赖…

使用PyAutoGUI识别PNG图像并自动点击按钮

在自动化测试、任务批处理等场景中,我们常常需要控制GUI程序的鼠标键盘操作。PyAutoGUI就是一个非常方便的Python模块,可以帮助我们实现这些操作。今天我们就来看看如何使用PyAutoGUI识别屏幕上的PNG图像,并自动点击图像所在位置。 C:\pythoncode\new\autoguirecongnizepng.py …

AlexNet,LeNet-5,ResNet,VGG-19,VGG-16模型

模型 AlexNet导入必要的库&#xff1a;加载类别名称&#xff1a;创建标签映射字典&#xff1a;加载图像数据和对应的标签&#xff1a;构建AlexNet模型&#xff1a;编译模型&#xff1a;训练模型&#xff1a; LeNet-5导入必要的库&#xff1a;加载类别名称&#xff1a;创建标签映…

程序卡在 B.处什么原因?如何处理?(串口配置无问题,重写putc无问题,但不打印)

文章目录 前提现象&#xff1a;debug&#xff1a;原因总结 前提 为了张流量券多加更一篇&#xff0c;是我2月份遇到的问题的总结&#xff0c;在我的笔记中&#xff0c;一直没发 现象&#xff1a; 已经配置好串口但不打印输出&#xff08;printf指向串口1 的SR寄存器&#xf…

CentOS下安装SVN客户端及使用方法

一、前言 Subversion&#xff08;SVN&#xff09;是一款开源的版本控制系统&#xff0c;它可以帮助开发者追踪和管理代码、文档或其他文件的更改历史。在Linux系统中&#xff0c;特别是在CentOS环境下&#xff0c;安装和使用SVN客户端是日常工作中常见的任务。本文将介绍如何在…

Neovim 配置全面解析(下)

Neovim 配置全面解析&#xff08;下&#xff09; 原文&#xff1a;Neovim 配置全面解析&#xff08;下&#xff09; - 知乎 (zhihu.com) 环境&#xff1a;Ubuntu 20.04 宿主机&#xff1a;windows &#xff08;windows terminal&#xff09;WSL 2 NVIM&#xff1a;v 0.10.0-de…

如何解压忘记了密码的加密zip压缩包?这两个方法收藏好!

加密是一种保护信息不被未经授权访问的重要手段。ZIP压缩包作为一种常见的文件压缩格式&#xff0c;zip文件加密是很多人都回去做的一件事情&#xff0c;那么zip加密文件如何解密&#xff1f;有几种方法可以解密呢&#xff1f;今天介绍几种方法给大家。 一、尝试常用密码 我们…

【Python】解决Python报错:TypeError: ‘xxx‘ object does not support item assignment

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

【busybox记录】【shell指令】unlink

目录 内容来源&#xff1a; 【GUN】【unlink】指令介绍 【busybox】【unlink】指令介绍 【linux】【unlink】指令介绍 使用示例&#xff1a; 删除文件 - 默认 常用组合指令&#xff1a; 指令不常用/组合用法还需继续挖掘&#xff1a; 内容来源&#xff1a; GUN &#x…

xcode依赖包package已经安装,但是提示No such module ‘Alamofire‘解决办法

明明已经通过xcode自带的swift包管理器安装好了依赖包&#xff0c;但是却还是提示&#xff1a;No such module&#xff0c;这个坑爹的xcode&#xff0c;我也只能说服气&#xff0c;但是无奈&#xff0c;没办法攻打苹果总部&#xff0c;只能自己想解决办法了 No such module Ala…

ClickHouse 与其他数仓架构的对比——Clickhouse 架构篇(四)

文章目录 前言ClickHouse与Hive的对比计算引擎的差异ClickHouse比Hive查询速度快的原因 ClickHouse与HBase的对比HBase的存储系统与ClickHouse的异同HBase的适用场景及ClickHouse不适合的原因 ClickHouse与Kylin的对比Kylin的架构Kylin解决性能问题的思路Kylin方案的缺陷ClickH…

图片处理软件有哪些?这三款软件好用

图片处理软件有哪些&#xff1f;在当今这个数字化时代&#xff0c;图片处理软件成为了我们日常生活和工作中不可或缺的工具。无论是为了修饰个人照片&#xff0c;还是为了设计专业海报&#xff0c;这些软件都能帮助我们轻松实现创意和美化。那么&#xff0c;究竟有哪些热门的图…

CEEMDAN +组合预测模型(CNN-Transfromer + XGBoost)

注意&#xff1a;本模型继续加入 组合预测模型全家桶 中&#xff0c;之前购买的同学请及时更新下载! 往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 VMD CEEMDAN 二次分解&#xff0c;Transformer-BiGRU预测模…

read test

功能性语言: 在.sh脚本下&#xff0c;read -p ——答应 read -t 时间 ——时间完成限制 特别注意空格。 test -n测试是内容一定要加双引号。 test 变量1 -ne 变量2 即比较大小。

视频汇聚EasyCVR平台视图库GA/T 1400协议与GB/T 28181协议的区别

在公安和公共安全领域&#xff0c;视频图像信息的应用日益广泛&#xff0c;尤其是在监控、安防和应急指挥等方面。为了实现视频信息的有效传输、接收和处理&#xff0c;GA/T 1400和GB/T 28181这两个协议被广泛应用。虽然两者都服务于视频信息处理的目的&#xff0c;但它们在实际…

22net冒泡排序与插入排序

冒泡排序 观看视频 【python练习题】每日一练_第八天_冒泡排序_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1QT4y197pa/?spm_id_from333.337.search-card.all.click&vd_source498ae9e9c7a8a7d16da872c9d74cdc38PS&#xff1a;视频中用的了numpy库&#xff0c;大…