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)

添加上以上定义就可以了,如图:

mac上使用charles Mac上使用qgis执行不成功_命名空间

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

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

仔细想想,应该是缺少相应的组件

右键项目–>Qt Project Setting

mac上使用charles Mac上使用qgis执行不成功_命名空间_02


勾选上GUI就可以了

mac上使用charles Mac上使用qgis执行不成功_标识符_03

以上!