qgis插件开发:如何通过maptool监控canvas鼠标事件?
发布于 作者:苏南大叔 来源:程序如此灵动~
本文中苏南大叔主要需求是获得地图坐标,监控鼠标事件仅仅是实现上述需要的必要手段。相关代码就分两篇文章来描述,一部分描述鼠标事件的监控机制,另一部分描述地图坐标的识别机制。

本文测试环境:qgis@3.16.14-hannover,win10。本篇文章的插件基于qgis plugin builder创建,具体的步骤可以参考下面这篇文章:
打开一张地图文件
打开一张地图文件,这事儿说起来应该是挺容易的。从同组的兄弟那里,获得了个一个江西省的地形地图文件,主要组成文件如下:

把主体tif文件拖进去qgis即可打开,而使用file=>open的话,似乎并不能满足我们的需求。有点奇怪不是?
添加mapTool开始监控
在打开了一张地图的前提下,为这个地图添加个maptool的概念,这个maptool能做啥呢?能做的事情很多。比如:本文中的需求,对鼠标事件进行监控。
maptool是作用于canvas上面的,所以要先获得canvas对象。
qgis里面的canvas和网页里面canvas貌似不是一个东西,概念不同。
def __init__(self, iface):
# ...
self.canvas = iface.mapCanvas()
# ...def iconAction(self):
# ...
from .testMapTool import TestMapTool
self.mapTool = TestMapTool(self.canvas, self.iface)
self.canvas.setMapTool(self.mapTool)
# ...testMapTool.py文件:
class TestMapTool(QgsMapToolEmitPoint):
def __init__(self, canvas, iface):
self.iface = iface
self.canvas = canvas
QgsMapToolEmitPoint.__init__(self, self.canvas)
def canvasReleaseEvent(self, e):
# ...
pass
def canvasPressEvent(self, e):
# ...
pass
def canvasMoveEvent(self, e):
# ...
pass这里监听了三个事件,分别是:move/press/release,即:鼠标移动,鼠标按下,鼠标抬起动作。那么,通过对事件e的解析,就可以继续后续逻辑。
获得坐标值
在canvasReleaseEvent或者canvasPressEvent或者canvasMoveEvent内,写自己的逻辑吧。下面是两个事件e和坐标point转化的例子。
toMapCoordinates()方法只存在于maptool里面,从QgsMapToolEmitPoint获得的能力。
def canvasReleaseEvent(self, e):
point = self.toMapCoordinates(e.pos())
# ...
passe.pos()就是鼠标事件的坐标,.x()就是lat值,.y()就是lon值。
def canvasReleaseEvent(self, e):
# from qgis._core import QgsPointXY
point = QgsPointXY(e.pos().x(),e.pos().y())
# ...
pass移除mapTool停止监控
self.canvas.setMapTool(None)
self.mapTool = None或者:
self.canvas.unsetMapTool(self.mapTool)
self.mapTool = None相关链接
总结
通过maptool获得对canvas的鼠标事件监控能力,通过e.pos()获得坐标,然后通过把坐标转化为point对象,实现后续逻辑。更多qgis相关文章,请点击苏南大叔的博客文章: