Qgis开发2-工程组织
sf2gis@163.com
2014年8月10日
1 Qgis工作原理
QGIS需要加载数据,并能够管理相关数据,然后显示出来。
QGIS有几个全局单例,用于维护整个工程中全局配置。
QGIS管理数据使用注册表Registry类,每个管理类都有相应的注册表类。
注意:
错误:global\qglobal.cpp L2262
QWidget must construct a QApplication beforeQPaintDevice
是由于使用QT的release库dll,但是在debug模式下,使用了debug的dll。修改方法为将qt 的release库dll添加到工程中。
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<