学习目标
了解QGIS C++加载矢量、栅格文件基本方式,并通过菜单调用这些方法。
参考内容
链接1:PyQGIS二次开发教程(一):准备工作
链接2:PyQGIS二次开发教程(二):加载影像与矢量
链接3:PyQGIS二次开发教程(三):学习制作菜单栏功能
作者:yoyi
码云镜像4:qgisapp.h、qgisapp.cpp
注意:没找到比较系统的C++二次开发内容,参考这个Python版的知乎专栏,写得比较详细清晰,非常有帮助,非常感谢该作者分享,下方中部分图片也直接引用专题中的图片,图片中水印均未删除,如涉及侵权,可联系我删除。
而且Python接口和C++基本一致,可能部分细节存在差异,需要注意。所以在学习的时候结合QGIS官方代码,能更准确一些。官方代码参考的是码云(Gitee),至于为什么不看Github,速度实在太慢了,还经常刷不出来,当然也可以下载下来看。当然有精力的话还是可以把qgisapp
完整代码阅读一遍的,可以更详细地了解QGIS功能模块。
主要内容
1.初始UI设计
使用QtDesigner设计图中界面,具体为
- 在MainWindow中间添加frame,并右击窗口将布局调整为垂直布局;
- 添加Dock Widget,吸附到窗口左侧。
- 然后添加一些初始化代码,具体参考链接1。
当然与Python不一样,需要为窗口类(App类)创建h文件和cpp文件,按照官方代码,该类直接继承自QMainWindow和对应的Ui类,(Qt默认创建的是将Ui类作为窗口类的一个成员变量的,我猜继承的好处是可以直接访问Ui的成员变量)
class QtGis : public QMainWindow, private Ui::QtGisClass
QtGis::QtGis(QWidget *parent) : QMainWindow(parent)
{
setupUi(this);
// 1. set title
setWindowTitle("QGIS Interface");
// 2. initial layer tree
QVBoxLayout* vl = new QVBoxLayout(dockWidgetContents);
mLayerTreeView = new QgsLayerTreeView(this);
vl->addWidget(mLayerTreeView);
// 3. initial map canvas
mMapCanvas = new QgsMapCanvas(this);
QHBoxLayout* hl = new QHBoxLayout(frame);
hl->setContentsMargins(0, 0, 0, 0)