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())
# ...
pass
e.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
相关文章,请点击苏南大叔的博客文章:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。