QGIS开发笔记(三):Windows安装版二次开发环境搭建(下):将QGis融入QtDemo,添加QGis并加载tif遥感图的Demo
前言
使用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的更多相关文章
- PHP全栈开发(三):CentOS 7 中 PHP 环境搭建及检测
简单回顾一下我们在(一).(二)中所做的工作. 首先我们在(一)中设置了CentOS 7的网络. 其实这些工作在CentOS 6中都是很容易的,因为有鸟哥的Linux私房菜这样好的指导. 但是这些操作 ...
- Django开发笔记三
Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.基于类的方式重写登录:views.py: from ...
- Lucene.Net 2.3.1开发介绍 —— 三、索引(二)
原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(二) 2.索引中用到的核心类 在Lucene.Net索引开发中,用到的类不多,这些类是索引过程的核心类.其中Analyzer是索引建立的 ...
- 【python】python彻底卸载的方法【windows安装版卸载的示例】
要想彻底干净的卸载python,如果是使用的安装版的话,其实很简单.[windows安装版] 就是点击安装包. 例如,当前你安装的版本是3.6.5,你想要把它卸载掉. 查看python版本的命令: 只 ...
- MySql5.7.11 for Windows 安装(二)
原文:MySql5.7.11 for Windows 安装(二) 安装之后,首先创建data文件夹(旧版本本来就有),管理员打开cmd,cd到bin文件夹,输入 mysqld –initialize- ...
- Modbus库开发笔记之十一:关于Modbus协议栈开发的说明(转)
源: Modbus库开发笔记之十一:关于Modbus协议栈开发的说明
- Redash 二开 - 后端环境搭建
Redash 二开 - 后端环境搭建 一.操作系统选择 官方文档有一句话:Windows users: while it should be possible to run Redash on a W ...
- 【转】Sqlite 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该...
开发环境: vs2010+.net framework 4.0+ System.Data.SQLite.DLL (2.0)今天在做Sqlite数据库测试,一运行程序在一处方法调用时报出了一个异常 混合 ...
- 总结Selenium自动化测试方法(二)测试环境搭建
(接上期内容) 二.测试环境搭建 1.安装python 现在python3.0比python2.0多了一些改进的功能(详见http://zhidao.baidu.com/link?url=3sT1g7 ...
- <VS2010>混合模式程序集是针对“v2.0”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集
在把以前写的代码生成工具从原来的.NET3.5升级到.NET4.0时,将程序集都更新后,一运行程序在一处方法调用时报出了一个异常: 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有 ...
随机推荐
- Maven 三种archetype说明合集【转载】
Maven 三种archetype说明 新建Maven project项目时,需要选择archetype. 那么,什么是archetype? archetype的意思就是模板原型的意思,原型是一个Ma ...
- UML 哲学之道——启航篇[一]
前言 简单去介绍一下uml的哲学之道也是自我整理之道. 正文 什么是uml,全程是统一建模语言(unified modeling language),简单的说就是用图形来表示文档. 是描述构造和文档化 ...
- Swin Transformer安装记录(国内源,飞快)
0. 设备环境 ubuntu--20.10 GPU--3080 cuda--11.0 torch--1.7.0 mmcv--1.3.8 mmdetection--2.11.0 所有的git的项目,都可 ...
- 使用mmdetection训练自己的coco数据集(免费分享自制数据集文件)
首先需要准备好数据集,这里有labelme标签数据转coco数据集标签的说明:labelme转coco数据集 - 一届书生 - 博客园 (cnblogs.com) 1. 准备工作目录 我们的工作目录, ...
- CAP 8.1 版本发布通告
前言 我们很高兴宣布 CAP 发布 8.1 版本正式版,我们在这个版本中主要是添加了一些新的配置项支持,并且根据用户反馈做了一些功能调整,同时在这个版本开始默认禁用了从7.2版本引入的并行发布消息. ...
- Signalr断线重连机制
前言 Signalr 即时消息发布到服务器后发现链接老是自动断开,导致无法发送广播后面百度搜了一下,signalr有个超时的机制 解决办法(js) //链接到自己的hub var connection ...
- 01_Vue技术-Hello案例分析
初始vue: 1.想让vue工作,就必须创建一个Vue实例,且要传入一个配置对象: 2.root容器里的代码依然符合html规范,只不过混入了一些特殊的vue语法: ...
- 零信任策略下K8s安全监控最佳实践(K+)
简介: 本文重点将围绕监控防护展开,逐层递进地介绍如何在复杂的分布式容器化环境中借助可观测性平台,持续监控K8s集群,及时发现异常的 API 访问事件.异常流量.异常配置.异常日志等行为,并且结合合理 ...
- Redis消息队列发展历程
简介:Redis是目前最受欢迎的kv类数据库,当然它的功能越来越多,早已不限定在kv场景,消息队列就是Redis中一个重要的功能.Redis从2010年发布1.0版本就具备一个消息队列的雏形,随着1 ...
- [HTML] 访问 a 链接不带 referer 的方式
html5 新属性 referrerpolicy: referrerpolicy no-referrer no-referrer-when-downgrade origin origin-when-c ...