为了在QT程序中嵌入一个地图,最终选择了QGIS来干这件事。选型阶段真是呵呵。我折腾的是QGIS2.4.0。

  首先,到官方网站下载安装QGIS。如果你跟我一样懒的话,可能希望下载一个已经编译好的windows版的QGIS。但是这里有个陷阱。咱们是要做二次开发的,千万不要下载安装那个看上去很美的QGIS Chugiak安装包,那里面缺lib库啊我摔!!一定要用那个在线安装下载的osgeo4w。下载选择advance install,在选择下载项时注意把libjpeg_ipp那个库取消掉,安装没有ipp的版本的,否则你这个版本在运行安装时就会提醒你找不到ippj-5.3.dll。在线下载大概半个多小时终于下载并安装好了。

  然后就是创建一个QT工程啦。

  创建好之后,咱们的目的是用QgsApplication替换掉QApplication跑一个最基本的MainWindow程序。那么在能跑起来之前都会遇到哪些坑呢?

  首先预处理器配置里要写上:

  GUI_EXPORT=__declspec(dllimport)

  ANALYSIS_EXPORT=__declspec(dllimport)

  CORE_EXPORT=__declspec(dllimport)

  这三行,否则会有一堆编译错误。

  然后找到OSGeo4W/apps/qgis-dev/,使用里面的bin目录,lib目录和include目录。你可能会发现和qgis-dev并列的还有个qgis目录,先不要用那个,qgis-dev的库编译出来是带着debug信息的,咱们还在测试阶段么不是。

  然后你可以正确编译出exe了,但是还不能运行。需要把OSGeo4W/bin下的dll全部都丢到exe同级目录下。你会说老师你TM傻啊,我把OSGeo4W/bin加入到系统变量里不就行了吗?

  不行!这是因为你可能跟我一样在机器里还装了乱七八糟的别的库,比如OSG3.3啊,flightgear啊。这些开源库可能依赖了不同版本的同一lib库,而你之前已经将他们加入到path中了。你可能会碰到说找不到定位序数点TIFFUnsetField 于libtiff.dll上。因为系统先找到的不是qgis编译时用的libtiff.dll。所以为了简单起见还是全拷贝吧,也就几百M。

  然后你以为可以开心的运行了?天真。你用debug跑的时候会碰到QT无情的报错:QWidget:Must construct a QApplication before a QPaintDevice. 这是因为你没用debug版本的库和dll啊,还是切换到release下吧。或者你就去自己编译一个debug版本的库吧。

  切到release下就可以跑了,一个空白的QT  mainwindow,感不感人?

研究QGIS二次开发笔记(一)的更多相关文章

  1. 【基于spark IM 的二次开发笔记】第一天 各种配置

    [基于spark IM 的二次开发笔记]第一天 各种配置 http://juforg.iteye.com/blog/1870487 http://www.igniterealtime.org/down ...

  2. Qt+QGIS二次开发:自定义类实现查询矢量数据的属性字段值(图查属性)

    在GIS领域,有两种重要的查询操作,图查属性和属性查图. 本文主要介绍如何在QGIS中通过从QgsMapToolIdentify中派生自定义类实现查询矢量数据的属性字段值(图查属性). 重点参考资料: ...

  3. Qt+QGis二次开发:矢量图层的显示样式

    原文链接:QGis二次开发基础 -- 矢量图层的显示样式

  4. Qt+QGIS二次开发:开发环境搭建(超级详细)

    原文链接: 1.qgis二次开发环境搭建(超级详细) 2.QGIS开发教程(1)——QGIS开发准备工作 3.QGIS(2.18.15 源码)+Qt(5/5.9.3)+VS2015(X64)编译

  5. Qt+QGis二次开发:加载栅格图层和矢量图层

    一.加载栅格图像 加载栅格图像的详细步骤在下面代码里: //添加栅格数据按钮槽函数 void MainWindow::addRasterlayers() { //步骤1:打开文件选择对话框 QStri ...

  6. Qt+QGis二次开发:打开S-57格式(*.000)电子海图数据,并设置多边形要素的显示风格

    不过多的废话了,直接上源码: addChartlayers()方法时“打开海图”按钮的triggered()信号所绑定的槽函数. //添加海图数据小按钮槽函数 void MainWindow::add ...

  7. phpcms二次开发笔记

    phpcms二次开发笔记 --soulsjie 以下载的全新的phpcms搭建一个新的站点为例,讲解如何利用phpcms进行二次开发 一.下载和安装phpcms http://www.phpcms.c ...

  8. Qt Qgis 二次开发——鼠标点击识别矢量要素

    Qt Qgis 二次开发--鼠标点击识别矢量要素 介绍: 识别矢量要素需要用到QGis的一个工具类:QgsMapToolIdentifyFeature 一个QgsMapTool的子类的子类,官方文档描 ...

  9. RTX二次开发笔记2

    问题一:关于DLL文件的引用 在安装文件夹内 APIObject.dll==>RTXSAPI.dll 服务器API接口 RTXCAPI.DLL ==> 客户端API接口 问题二:RTX二次 ...

随机推荐

  1. div中文字水平和垂直居中的css代码

    HTML元素 <div>水平垂直居中</div> css样式 div{ width:200px;height:200px; /*设置div的大小*/ border:1px so ...

  2. 使用Spring Session做分布式会话管理

    在Web项目开发中,会话管理是一个很重要的部分,用于存储与用户相关的数据.通常是由符合session规范的容器来负责存储管理,也就是一旦容器关闭,重启会导致会话失效.因此打造一个高可用性的系统,必须将 ...

  3. 【英语】Bingo口语笔记(39) - Get系列

  4. 第三集 欠拟合与过拟合的概念、局部加权回归、logistic回归、感知器算法

    课程大纲 欠拟合的概念(非正式):数据中某些非常明显的模式没有成功的被拟合出来.如图所示,更适合这组数据的应该是而不是一条直线. 过拟合的概念(非正式):算法拟合出的结果仅仅反映了所给的特定数据的特质 ...

  5. android adt自带eclipse无法设置ndk路径(找不到NDK配置)

    分步阅读 到android sdk官网下载r23版本的adt时自带的eclipse没有设置ndk路径的地方,通过Install New Software 发现无法更新,那么如何解决这个问题呢? 方便他 ...

  6. 嵌入式 hi3518平台uboot引导nfs文件系统

    首先贴出来我的bootargs的设置(注没有换行符!!!): setenv bootargs noinitrd mem=64M root=/dev/nfs init=/linuxrc rw nfsro ...

  7. C# 对Excel文档打印时的页面设置

    1.对打印页面的朝向,页宽,页高进行设置 参考源码[1] using Excel = Microsoft.Office.Interop.Excel; Excel.Application tmpExce ...

  8. Delphi 实现16进制转字符串及字符串(中文)转16进制

    //-----------------------------------------------//16进制字符转整数,16进制字符与字符串转换中间函数//--------------------- ...

  9. db file sequential read (数据文件顺序读取)

    转载:http://www.dbtan.com/2010/04/db-file-sequential-read.html db file sequential read (数据文件顺序读取): db ...

  10. android启动页优化实践

    最近观看友盟统计发现App启动页跳出率很高,观看启动页的平均启动时间为2.8s,如下图: 所以一个很现实的问题就出来了,优化启动页面... (一)做了什么? 我们的启动页面主要用于展示启动页面,加载网 ...