为了在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. 【笨嘴拙舌WINDOWS】tagTEXTMETRIC结构

    tagTEXTMETRIC用于定义在window输出文字时字的大小,其结构如下: 我在窗体上写了两句话,来详细解剖该结构(在MM_TEXT模式下输出) tmHeight表示一行文字的高度.改例中值为1 ...

  2. HDU 5033 (单调栈维护凸包) Building

    题意: 一个人在x轴上,他的左右两侧都有高楼,给出楼的横坐标Xi和高度Hi还有人的位置pos,求人所能看到的天空的最大角度. 分析: 将建筑物和人的位置从左到右排序,对于每个位置利用栈求一次人左边建筑 ...

  3. bzoj2396: 神奇的矩阵

    与51nod1140一样.不过这题是多组数据的...坑.... #include<cstdio> #include<cstring> #include<cctype> ...

  4. (四)Logistic Regression

    1 线性回归 回归就是对已知公式的未知参数进行估计.线性回归就是对于多维空间中的样本点,用特征的线性组合去拟合空间中点的分布和轨迹,比如已知公式是y=a∗x+b,未知参数是a和b,利用多真实的(x,y ...

  5. AIX 第4章 指令记录

    root@db:/#lsdev -Cc disk --查看磁盘设备信息   -C customized -c class hdisk0       Available 00-08-00 SAS Dis ...

  6. ORACLE RAC集群硬件资源管理与单节点的区别

    硬件资源是由OS kernel管理的,应用软件是不能直接访问硬件的,必须通过OS kernel提供的API接口间接访问,OS kernel 除了要完成用户的请求,还通过进程调度等机制来控制多进程对资源 ...

  7. C++类构造函数初始化列表

    C++类构造函数初始化列表 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample {public:     ...

  8. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File

    作为一个完成的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别 是:SharePreference.SQLite.Content Provider和File ...

  9. delphi 中 $是什么意思 串口中使用

    delphi 中 $是什么意思? 比如:$41----$5A 意识是26个字母, 可以用$来表示? $在delphi 中还可以怎么用?1.表示16进制,$41就是65,第一个字母的ASCII值 pro ...

  10. 将cocos2dx项目从Visual Studio 迁移到 xcode

    因为Visual Studio和XCode的巨大差异性,一开始选择任何一个IDE,都会有一个迁移的过程,XCode的迁移到Visual Studio相对非常简单,不用再介绍.将项目从Visual St ...