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

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

时间:2024-05-29 16:59:12浏览次数:30  
标签:pMapCanvas QGis qgis TestWidget file new 二次开发 QtDemo include

前言

  使用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即可:
  在这里插入图片描述

标签:pMapCanvas,QGis,qgis,TestWidget,file,new,二次开发,QtDemo,include
From: https://www.cnblogs.com/qq21497936/p/18220616

相关文章

  • Excalidraw画板调研-二次开发
    最近刚入职一家公司,主管让我研究一下Excalidraw。有一个需求需要用到画板,Excalidraw是开源的,某些功能如果通过传参无法做到,就需要二次开发。目前遇到几个困难:1.如果通过传参来实现,Excalidraw是基于react的,而我们的项目是VUE框架,就无法直接使用基于react的Excalidraw。虽然后面......
  • SUMER UI3.0组件库,基于Uni-app前端框架!一端开发,多端运行!本组件库可快速二次开发各种类
    sumer-ui介绍基于uView微信小程序UI组件库,兼容vue3。本插件是SUMER组件库,只提供组件库源码下载(不包含模板源码),本组件库可快速二次开发各种类别各行业模板,包括:商城、视频、直播、聊天、支付、新闻、社区、地图、导航、出行、社区、博客、新闻、游戏、影视、订票、广告等,......
  • CATIA二次开发VB入门(1)——认识catia二次开发,宏的录制、回放和编辑
    目录引出认识CATIA二次开发刘瑞欣vb程序设计教程Excel中的vba开发catia中的vba开发宏的录制、回放和编辑宏代码精简画圆柱阵列宏Macro文件的3种类型宏的保存:文件夹,项目,catia文件宏加入到工具条中插曲:工具条的恢复总结发生肾么事了??鼠标中键旋转不了解决:特征树不显示......
  • CAD二次开发(1)- 初步和CAD进行通讯交互
    1.安装CAD和VS我这里CAD选择的是2022版本VisualStudioEnterprise2022(64位)2.在VS上创建项目2.1创建类库类型的项目这里要特别注意,我们选择的类库是需要最终生成.dll文件的,经过我的测试,只有上图的模板可以使用,具体原因我需要后面去探索。2.2引入CAD的相......
  • 【QGIS入门实战精品教程】10.7: 基于DEM的地形因子分析(坡度、坡向、粗糙度、山体阴影、
    文章目录一、加载dem二、山体阴影三、坡度四、坡向五、地形耐用指数六、地形位置指数七、地表粗糙度一、加载dem二、山体阴影方法一:符号系统利用符号系统中的山体阴影,渲染出阴影效果。方法二:山体阴影工具该算法计算输入中的数字化地形模型的山体阴......
  • OBS直播二次开发_投屏
    相关文章链接OBS直播二次开发_OBS直播软件介绍OBS直播二次开发_windows版本编译OBS直播二次开发_简单教程OBS直播二次开发_界面修改相关OBS直播二次开发_切换视口水平和垂直OBS直播二次开发_设置快捷键OBS直播二次开发_添加新的uiqt界面OBS直播二次开发_调用get......
  • QGIS DEM数据快速获取
    背景Dem是非常重要的数据,30m的精度也是最容易获取的,目前有很多种方式可以获取,比如地理空间数据云,今天介绍用QGIS插件获取。这种方式的最大优势是方便快捷,当我们有评价区域范围图层时,更加方便。插件下载与安装插件-管理并安装插件-搜索下载OpenTopographyDEMDownloader......
  • SOLIDWORKS二次开发服务商 慧德敏学
    SOLIDWORKS是一套三维设计软件,采用特征建模、变量化驱动可方便地实现三维建模、装配和生成工程图。SOLIDWORKS软件本身所具有的交互方式,可以使用户对已生成模型的尺寸、几何轮廓和相互约束关系随时进行修改,而不需要编程。但要实现设计意义上的变量化绘图和系列化设计,需要......
  • QGIS开发笔记(二):Windows安装版二次开发环境搭建(上):安装OSGeo4W运行依赖其Qt的基础环境De
    前言  使用QGis的目的是进行二次开发,或者说是融入我们的应用(无人车、无人船、无人机),本片描述搭建QGis二次基础开发环境,由于实在是太长了,进行了分篇:上半部分:主要是安装好后,使用QtCreator可以使用QGIs的apps下的Qt使用对应的编译器编译不带qgis的空工程。下半部分:在上半......
  • 二维CAD二次开发
         CAD二次开发语言主要有VBA,Lisp,C#,C++。Lisp是内置语言,和二维CAD本身交换容易,在实现开发中,一般先用C#语言,满足大部分功能,C++objectarx功能最为强大,C++本身难学,只是对于大型程序有用。这里主要介绍C#语言。C#主要通过以下方式进行开发。1, 编译为dll的方式,启动CAD......