学习目标
部署一个QGIS二次开发环境
运行一个最简单的示例,了解QGIS二次开发基本框架
参考博文
链接:QGIS二次开发环境配置(Visual Studio 2015 + Qt 3.12 + QGIS 3.16)
作者:浅眠&
注意:文章最后提到的问题我遇到了,但当时没看到这段内容,从别的地方百度了很久也没解决,最后又回来看了一遍,才发现作者已经给出解决方法了。哭死……
学习过程
环境下载和安装
个人比较喜欢VS,而且又想也可以在Win7上开发,所以用的VS2005版本,但是安装Qt时,自带了Qt Creator,设计界面的时候还是需要的。
在安装VS的时候,还想找64位的版本,后来发现好像只有32位的,而且32位的VS也是可以开发64位程序的,所以……
Qt选择的是3.12,在线下载器下载需要登录,现去Qt官网注册了,结果还是登不上去,不知道什么原因。百度解决方案是,在登录页面断网,然后就可以跳过登录了。(跟Cocos Creator一样,不知道为什么非要登录)
QGIS选择的是3.28版本,下载的时候还是最新的,现在就不是了,更新挺快的。本来还想选3.22,因为怕VS2005不支持,因为所说最新的要C++17支持,但后来用OSGeo4W下载的时候还是选择了28。这一步遇到的困难是官方几个链接都下载不了,最后自己百度了一个国内的镜像,才下载完成的。
在一步步安装完成后,就到了喜闻乐见的“Hello World”阶段。
简单测试实例
为了验证是否安装成功,都得写一个简单的程序测试一下。按照参考博文中的内容,手抄了一遍。
程序主要包括一个main
函数和一个对话框界面类QGISTest
。
QGISTest
类继承自QMainWindow
,不同于标准Qt编程,没有用QML设计界面,而是用纯代码的方式,添加了一个菜单,用于打开加载文件对话框,加载shp文件,并将主窗口设置为一个QgsMapCanvas
实例,就像下面这样
mapCanvas = new QgsMapCanvas();
this->setCentralWidget(mapCanvas);
非常简单。
而main
函数,则是通过QgsApplication
初始化一些参数,然后实例化QGISTest
类,并运行。
然后就可以了。
需要注意的是,直接运行程序可能无法运行,会弹出Qt插件未加载的错误。
此时找到QGIS安装目录中的D:\Software\OSGeo4W\apps\Qt5\plugins\platforms文件夹(根据自己的安装位置进行修改),将其复制到可执行文件(.exe)同一目录下即可。
学习总结
在使用QGIS二次开发时,最重要的两个类就是界面类和程序类。
其中界面类继承自QWidget
,例子中的QGISTest
继承自QMainWindow
,而QMainWindow
继承自QWidget
。主界面设计可以在Qt Desinger中进行,生成C++代码后,然后在VS中编写功能。
程序类继承自QApplication
,而QGIS中继承QApplication
编写了QgsApplication
,这应该作为将来二次开发的程序类基类,主要用于初始化参数。
学习展望
示例中用到了几个常用类,下一步应优先研究学习。
Qt类
QApplication
:Qt基础类,采用单例模式,必须在QWidget
前实例化,主要了解其生命周期和使用限制。
QWidget
:Qt界面类基类,主要了解其主要子类,以及支持的功能。知道哪些可以在Qt Desinger中设计,哪些必须用代码。
QMenu
:菜单类,应该不需要太多了解。
QAction
:操作类,菜单树的叶节点。需要了解其“信号-槽”机制原理和使用限制。
QList
:应该就是个线性表类,暂时不需要太多了解。
QFileDialog
:打开文件对话框类,简单了解实例化和限制格式就够了。
QGIS类
QgsApplication
:QGIS应用类基类,根据需要对其进行继承。
QgsMapCanvas
:QGIS画面类,应该是重点需要学习的类,后续的主要操作都是在画布上进行。
QgsMapLayer
:图层类,向画布中添加图层必不可少的类,也是要重点学习,但估计内容不多。
QgsVectorLayer
:矢量图层类,目测是QgsMapLayer
的子类,需要了解,但内容应该也不多。