Qgis开发2-工程组织

Qgis开发2-工程组织

sf2gis@163.com

2014年8月10日

 

1  Qgis工作原理

QGIS需要加载数据,并能够管理相关数据,然后显示出来。

QGIS有几个全局单例,用于维护整个工程中全局配置。

QGIS管理数据使用注册表Registry类,每个管理类都有相应的注册表类。

注意:

错误:global\qglobal.cpp L2262

QWidget must construct a QApplication beforeQPaintDevice

是由于使用QTreleasedll,但是在debug模式下,使用了debugdll。修改方法为将qt releasedll添加到工程中。


1.1 全局工程单例

1.1.1 QgsApplication::instance()

QApplication的扩展类,在工程中代替QApplication。

本类的用途是配置工程的全局路径和变量。所有配置信息应该只出现在本类中。大部分成员函数为静态。

setPluginPath():设置插件的目录。在Qgis的install工程编译后,会有一个plugin文件夹。

initQgis():生成QgsProviderRegistry、QgsMapLayerRegistry的单例,用于管理驱动和图层。

1.1.2 QgsProject::instance()

读写工程文件状态。

当前qgis每个应用只有一个工程,但未来不确定是否可以使用多个工程。

1.2 全局数据管理注册表单例类

1.2.1 QgsProviderRegistry

也是一个全局单例类,用于管理全局驱动。

在Qgis::initQgis()中生成单例。

1.2.2 QgsMapLayerRegistry

也是一个全局单例类,用于管理全局图层数据(不管理显示)。

在Qgis::initQgis()中生成单例。

 

1.3 图层管理类QgsLayerTree

QgsLayerTreeNode:代表单一图层。

QgsLayerTreeGroup:node的容器。

QgsLayerTreeLayer:node的子类,代表QgsMapLayerRegistry中一个图层。

1.4 显示数据的主窗口QgsMapCanvas

1.4.1QgsMapCanvas

所有数据在此控件中显示。交互功能也在此控件中控制。

freeze():用于阻止事件,在图层加载、删除时应该先冻结,完成后解冻。

refresh():重绘。

1.4.2QgsLayerTreeMapCanvasBridge

连接QgsMapCanvas和QgsLayerTreeGroup,管理所有图层的显示。

图层的可见性、图层的加入、删除等显示图层显示的,都在这里管理。

QgsMapCanvas必须要有一个此类对象来管理图层的显示状态。

 

2  QGIS构建空白工程(vs2008)

2.1 准备

1)       构建Qt Application工程:选择core,gui,xml模块。

2)       添加库头引用:OSGEO4W/include,QGIS/include

3)       添加宏指令:

CORE_EXPORT=__declspec(dllimport)

GUI_EXPORT=__declspec(dllimport)

PYTHON_EXPORT=__declspec(dllimport)

ANALYSIS_EXPORT=__declspec(dllimport)

APP_EXPORT=__declspec(dllimport)

CUSTOMWIDGETS_EXPORT=__declspec(dllimport)

4)       添加库lib目录和lib文件:

OSGEO4W/lib,QGIS/lib

这里要特别注意,在vs下,会默认添加debug版的qt lib文件(有d后缀),如果发现,一定要替换为release(无d后缀)版的。

qgis_core.lib

qgis_gui.lib

qgis_analysis.lib

qtcore.lib

qtgui.lib<

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

弗里曼的小伙伴

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

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

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

打赏作者

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

抵扣说明:

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

余额充值