Qgis开发1:总则
2014年8月9日
2014年8月20日添加二次开发原则
所有类名以Qgs开头:QgsPoint。
成员数据:所有数据为私有。以m为前缀:mMapCanvas。
成员函数:所有成员函数以小写字母开头。所有的成员数据获取函数直接以其名字为函数名,无前缀。如:mapCanvas()。
每个类单独一个文件。
每个文件头都要有相关声明注释。
变量:小写开头:mapCanvas。
枚举:大写开头:enum UnitType{Meters,Feet,Degrees,UnknownUnit}。
全局变量、宏:全部大小。const long GEOCRS = 3857。
保持缩进。
保持{}单独占一行。
所有QtDesigner生成的ui文件(xml,用于用户可视化布局),都有一个ui_xx.h的头文件。在这个文件中,包含两个类,一个ui_xx类,是ui文件的c源文件。另一个xx类,用于包装ui_xx类,并供其它程序调用。
Qgis规定:所有UI生成的类,都要加上Base后缀:QgsPluginManagerBase。
对话框:所有对话框应该实现以下功能:ToolTip Help,WhatsThis Help,Help button link to web(option)。
API尽量保持稳定,当需要更新时,要在旧API上加入声明和注释及新api注释。
//@deprecated doSomethingBetter()
Q_DECL_DEPRECATEDbool doSometing()
对于外来代码或是多次使用代码,使用函数:便于维护,减少多个版本可能性。
比较时,常量在前:减少==被误写为=的可能性。
多使用空格和(),增加可读性,避免误解造成逻辑错误。
尽量使用{},减少可能的作用域错误。
尽量精减选项,设置合适的选项默认值。
尽量减少widget。排版麻烦。
任何控制都不要太大,尽量使用scroll。
尽量分组。
不要使用嵌套的tab。
尽量使用QButtonBox。
对于退出等操作按键,要尽量单独放置,避免误操作。
高级选项不要放在一般选项中,防止新手混乱。
icon的风格要统一。
如果有打开对话框的按钮,加上…。
Label首字母大写,不要使用:结束。
尽量减少术语,以俗语替换。
QGIS由四个主要组成部分:
GUI:所有的显示模块,基于core开发(qgis_gui.dll)。
CORE:所有基本功能(qgis_core.dll)。
ANALYSIS:所有分析功能,基本CORE开发(qgis_analysis.dll)。
NETWORK ANALYSIS:拓扑分析功能(qgis_networkanalysis.dll)。
参考:
http://hub.qgis.org/projects/quantum-gis/wiki/Developers_Corner#Help_on_writing_custom_apps_with_QGIS_API
http://qgis.org/api/2.4/modules.html
使用Qgis进行开发,一般分为几种情况。
一是需要一个完整的GIS程序,也就是大而全的系统,这种系统具有所有常用的功能。那么基于此种需求的开发,应该扩展QGIS这个工程,利用已有的系统为基础开发新的功能。
QgisApp可以作为库直接被导出使用(只能扩展了),也可以直接在Qgis的工程进行开发(可以修改、删除、增加),然后导出。可以根据需要选择开发模式。
二是只需要GIS作为一个组件,需要与其它程序配合。这种情况下,应该使用QGIS的几个核心库进行开发,相信其中大部分功能,qgis中都有实现,可以此为基础进行开发。
不论以上那种情况,都要以Qgis工程为主线进行研究。
对于QgisApp中的组件,是否能够直接导出使用呢?
QGIS工程中都有导出接口,但所有内容都是以QgisApp为基础的,QgisApp使用时需要加载所有内容,比较庞大。想要只使用其中的部分组件几乎是不可能的(需要分离Qgis,但涉及面太广)。可能QGIS的本意是想逐渐完善后再分离出各个组件吧,但现在的代码都是将QgisApp内置在各个文件中的,如果没有QgisApp的支撑,几乎无法运行(个别简单的组件可以直接用库导出)。
所以,未来的QGIS有可能跟Arcgis一样做成各种分离的组件,更加方便二次开发。但现阶段,只能依赖核心库自己动手开发。我想,这也是为什么QGIS没有被大范围推广的原因吧。