Qt调用QGIS出现的问题总结

137 篇文章 47 订阅
16 篇文章 5 订阅

QGis具有非常强大的矢量数据功能,但是Qt关于调用QGis二次开发过程中会出现一系列的问题,特此在这记录一下。

环境:Qt5.7+VS2013+QGIS.Release版

1.首先要注意的是,如果你的程序是Debug版本调用的QGis版本也必须是Debug版本;如果你的程序是Release版本,那么调用的QGis版本也必须是Release版本。如果它们的版本不一致,例如程序是Debug版本但是QGis确实Release版本,在调用构造画布的时候回出现闪退的情况。

class MainCanvas :public QgsMapCanvas {
     ...
}
...
mainMap = new MainCanvas(widget);

输出信息:

QWidget: Must construct a QApplication before a QWidget

2.调用QGIS的时候,把包含目录和lib库目录都包含进去了,也把链接库也包含进去了,但是还是会出现以下编译错误:

1>..\QGis\include\qgswkbtypes.h(37): error C2079: “QgsWKBTypes”使用未定义的 class“CORE_EXPORT”
1>..\QGis\include\qgswkbtypes.h(38): error C2143: 语法错误 : 缺少“}”(在“public”的前面)
1>..\QGis\include\qgswkbtypes.h(38): error C2143: 语法错误 : 缺少“;”(在“public”的前面)
1>..\QGis\include\qgswkbtypes.h(38): error C2059: 语法错误:“public”
1>..\QGis\include\qgswkbtypes.h(463): error C2825: 'QgsWKBTypes': 当后面跟“::”时必须为类或命名空间
1>..\QGis\include\qgswkbtypes.h(463): error C2061: 语法错误: 标识符“QgsWKBTypes”
1>..\QGis\include\qgswkbtypes.h(465): error C2825: 'QgsWKBTypes': 当后面跟“::”时必须为类或命名空间
1>..\QGis\include\qgswkbtypes.h(465): error C2061: 语法错误: 标识符“QgsWKBTypes”
1>..\QGis\include\qgswkbtypes.h(480): error C3861: “isMultiType”:  找不到标识符
1>..\QGis\include\qgswkbtypes.h(555): error C3861: “geometryType”:  找不到标识符
1>..\QGis\include\qgswkbtypes.h(578): error C3861: “hasZ”:  找不到标识符
1>..\QGis\include\qgswkbtypes.h(578): error C3861: “hasM”:  找不到标识符
1>..\QGis\include\qgswkbtypes.h(769): error C2825: 'QgsWKBTypes': 当后面跟“::”时必须为类或命名空间
1>..\QGis\include\qgswkbtypes.h(769): error C2061: 语法错误: 标识符“QgsWKBTypes”
1>..\QGis\include\qgswkbtypes.h(771): error C2825: 'QgsWKBTypes': 当后面跟“::”时必须为类或命名空间
1>..\QGis\include\qgswkbtypes.h(771): error C2061: 语法错误: 标识符“QgsWKBTypes”
1>..\QGis\include\qgswkbtypes.h(800): error C2825: 'QgsWKBTypes': 当后面跟“::”时必须为类或命名空间
1>..\QGis\include\qgswkbtypes.h(800): error C2061: 语法错误: 标识符“QgsWKBTypes”
1>..\QGis\include\qgswkbtypes.h(802): error C2825: 'QgsWKBTypes': 当后面跟“::”时必须为类或命名空间
1>..\QGis\include\qgswkbtypes.h(802): error C2061: 语法错误: 标识符“QgsWKBTypes”
1>..\QGis\include\qgswkbtypes.h(816): error C2825: 'QgsWKBTypes': 当后面跟“::”时必须为类或命名空间
1>..\QGis\include\qgswkbtypes.h(816): error C2143: 语法错误 : 缺少“;”(在“Type”的前面)
1>..\QGis\include\qgswkbtypes.h(816): error C2146: 语法错误: 缺少“;”(在标识符“returnType”的前面)
1>..\QGis\include\qgswkbtypes.h(816): error C2275: “Type”: 将此类型用作表达式非法
1>..\QGis\include\qgswkbtypes.h(816): error C2065: “returnType”: 未声明的标识符
1>..\QGis\include\qgswkbtypes.h(818): error C2065: “returnType”: 未声明的标识符
1>..\QGis\include\qgswkbtypes.h(819): error C2065: “returnType”: 未声明的标识符
1>..\QGis\include\qgswkbtypes.h(833): error C2825: 'QgsWKBTypes': 当后面跟“::”时必须为类或命名空间
1>..\QGis\include\qgswkbtypes.h(833): error C2143: 语法错误 : 缺少“;”(在“Type”的前面)
1>..\QGis\include\qgswkbtypes.h(833): error C2146: 语法错误: 缺少“;”(在标识符“returnType”的前面)
1>..\QGis\include\qgswkbtypes.h(833): error C2275: “Type”: 将此类型用作表达式非法
1>..\QGis\include\qgswkbtypes.h(833): error C2065: “returnType”: 未声明的标识符
1>..\QGis\include\qgswkbtypes.h(835): error C2065: “returnType”: 未声明的标识符
1>..\QGis\include\qgswkbtypes.h(836): error C2065: “returnType”: 未声明的标识符
1>..\QGis\include\qgswkbtypes.h(846): error C2825: 'QgsWKBTypes': 当后面跟“::”时必须为类或命名空间
1>..\QGis\include\qgswkbtypes.h(846): error C2143: 语法错误 : 缺少“;”(在“Type”的前面)
1>..\QGis\include\qgswkbtypes.h(846): error C2146: 语法错误: 缺少“;”(在标识符“flat”的前面)
1>..\QGis\include\qgswkbtypes.h(846): error C2275: “Type”: 将此类型用作表达式非法
1>..\QGis\include\qgswkbtypes.h(846): error C2065: “flat”: 未声明的标识符
1>..\QGis\include\qgswkbtypes.h(848): error C2065: “flat”: 未声明的标识符
1>..\QGis\include\qgswkbtypes.h(849): error C2825: 'QgsWKBTypes': 当后面跟“::”时必须为类或命名空间
1>..\QGis\include\qgswkbtypes.h(849): error C2061: 语法错误: 标识符“QgsWKBTypes”
1>..\QGis\include\qgswkbtypes.h(850): error C2825: 'QgsWKBTypes': 当后面跟“::”时必须为类或命名空间
1>..\QGis\include\qgswkbtypes.h(850): error C2143: 语法错误 : 缺少“)”(在“NoGeometry”的前面)
1>..\QGis\include\qgswkbtypes.h(850): error C2059: 语法错误:“)”
1>..\QGis\include\qgswkbtypes.h(851): error C2143: 语法错误 : 缺少“;”(在“return”的前面)
1>..\QGis\include\qgswkbtypes.h(851): error C2825: 'QgsWKBTypes': 当后面跟“::”时必须为类或命名空间
1>..\QGis\include\qgswkbtypes.h(851): error C2143: 语法错误 : 缺少“;”(在“NoGeometry”的前面)
1>..\QGis\include\qgswkbtypes.h(851): error C2440: “return”: 无法从“int”转换为“Type”
1>          转换为枚举类型要求显式转换(static_cast、C 样式转换或函数样式转换)
1>..\QGis\include\qgswkbtypes.h(852): error C2181: 没有匹配 if 的非法 else
1>..\QGis\include\qgswkbtypes.h(856): error C2059: 语法错误:“private”
1>..\QGis\include\qgswkbtypes.h(883): error C2059: 语法错误:“}”
1>..\QGis\include\qgswkbtypes.h(883): error C2143: 语法错误 : 缺少“;”(在“}”的前面)

...

出现以上错误是因为缺少相应的宏定义:

GUI_EXPORT=__declspec(dllimport)
CORE_EXPORT=__declspec(dllimport)

添加上以上定义就可以了,如图:
这里写图片描述

3.我想把和QGIS相关的业务全部封装到dll库中,但是以上配置好了之后,重新编译还是出现以下错误:

fatal error C1083: 无法打开包括文件: “QIcon”: No such file or directory

仔细想想,应该是缺少相应的组件
右键项目–>Qt Project Setting
这里写图片描述
勾选上GUI就可以了
这里写图片描述

以上!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值