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”版的运行时生成的,在没有 ...
随机推荐
- 今天我们来聊一聊Java中的Semaphore
写在开头 在上几天写<基于AQS手写一个同步器>时,很多同学留言说里面提到的Semaphore,讲得太笼统了,今天趁着周末有空,咱们就一起详细的学习和梳理一把 Semaphore. 什么是 ...
- HarmonyOS NEXT应用开发—听歌识曲水波纹特效案例
介绍 在很多应用中,会出现点击按钮出现水波纹的特效. 效果图预览 使用说明 进入页面,点击按钮,触发水波纹动画. 再次点击按钮,停止水波纹动画. 实现思路 本例涉及的关键特性和实现方案如下: 要实现存 ...
- StarRocks X Flink CDC,打造端到端实时链路
简介: 作为一款全平台极速 MPP 架构,StarRocks 提供了多种性能优化手段与灵活的建模方式,在预聚合.宽表和星型/雪花等多种模型上,都可以获得极致的性能体验.通过 StarRocks 结合 ...
- OceanBase再破纪录!核心成员陈萌萌:坚持HTAP就是坚持我们做数据库的初心
简介: 2021年5月20日,据国际事务处理性能委员会(TPC,Transaction Processing Performance Council)官网披露,蚂蚁集团自主研发的分布式关系型数据库Oc ...
- Inclavare Containers:云原生机密计算的未来
简介:本文为你详细的梳理一次 Inclavare Containers 项目的发展脉络,解读它的核心思想和创新技术. 作为业界首个面向机密计算场景的开源容器运行时,Inclavare Conta ...
- 阿里面试Redis最常问的三个问题:缓存雪崩、击穿、穿透(带答案)
那提到Redis我相信各位在面试,或者实际开发过程中对缓存雪崩,穿透,击穿也不陌生吧,就算没遇到过但是你肯定听过,那三者到底有什么区别,我们又应该怎么去防止这样的情况发生呢,我们有请下一位受害者. 面 ...
- 16.prometheus监控总结
一.监控流程总结 1.需要在被监控的服务器上安装xx_exporter来收集数据(可以是源码安装,最好用docker.docker-compose) 2.添加Prometheus配置,去收集(xx_e ...
- LabView中使用VISA设备清零时,会发送00
最近有为小伙伴跟我说他使用串口的时候通信遇到了问题,我看到他的在程序循环中使用了VISA设备清零控件,出于好奇我就复现了一下,发现每次调用VISA设备清零控件的时候,会主动向串口中发送00数据 一.测 ...
- Oracle和达梦:查询系统表、系统表字段
1.查询系统表 当前模式下所有的表 可以查询到:表名.表注释 select * from user_tab_comments where TABLE_TYPE = 'TABLE' 2.查询系统表字段 ...
- 题解:CF1941G Rudolf and Subway
原题链接 简化题意 一个无向连通图中将边分成了不同颜色(保证同种颜色联通),问从 \(b\) 到 \(e\) 最短需要经过几种颜色 思路 考虑因为同种颜色联通,可直接在读入的时候开两个 vector ...