Qigs 添加数据的方式其实有两种,一种在非编辑模式下,一宗在编辑模式下,编辑模式下的数据操作是可以追溯的,可撤销,可恢复。编辑模式下的数据操作基本都是交互式操作,所以和事件是分不开的。qgis 的有些事件是和图层绑定在一起的,前面说过,qgis有当前图层的概念,qgis的内部事件的操作逻辑也是和当前图层绑定在一起的。所以,如果我们写自己的事件的话,为了避免和qgis的事件有冲突,通常要去掉qigs的事件,我们是二次开发,原则上不动qgis的源码,所以会去除当前图层,具体如何操作,后面会介绍。
1、事件
1.1、Tool 工具
无论是arcgis 还是qgis 都有tool的概念,简单来说,就是一种和地图交互的类。事件也是和这些Tool息息相关的。先看下Qgis里面内置的一些重要的Tools类。接下来,我们主要以 QgsMapToolEdit(地图编辑类)和QgsMapToolIdentify(地图拾取类) 两个主要类介绍事件。
当我们要自定义一个工具的时候,一般这样写,下面是一个继承了QgsMapToolIdentify基类的类。其中覆写了五个事件,依次为键盘按下事件,键盘抬起事件,鼠标按下事件,鼠标抬起事件和鼠标移动事件。
class BTool : public QgsMapToolIdentify
public:
BTool(QgsMapCanvas* pMapCanvas);
~BTool();
protected:
void keyPressEvent(QKeyEvent* e) override;
void keyReleaseEvent(QKeyEvent* e) override;
void canvasPressEvent(QgsMapMouseEvent* e) override;
void canvasReleaseEvent(QgsMapMouseEvent* e) override;
void canvasMoveEvent(QgsMapMouseEvent* e) override;
};
其中在键盘事件中,可通过下面方法判断是按下了哪个键,qgis里面是有按键的枚举值的,我一般是通过这种数字去判断。27 表示按下的是ESC 的键。
e->nativeVirtualKey() == 27
在鼠标事件中,可通过下面方法判断是左键,还是右键,下面的代码表