qgis插件开发:如何利用信号/槽从maptool传回点信息?
发布于 作者:苏南大叔 来源:程序如此灵动~
书接上文,苏南大叔利用mapTool对鼠标事件进行监控,进而拿到了坐标值。现在,新的问题来了:拿到的坐标值,如何传递回主界面呢?

拿到坐标值的这个动作,是监控鼠标事件获得的。随时都会触发,并不是普通的函数返回值这样操作就可以搞定的。本文的解决方案使用了pyqtSignal这个概念,具体上来说,就是:信号和槽函数。
测试环境:win10,qgis@3.16.14-hannover。
前文回顾:
本文的顺利阅读,可能需要您先熟悉下面这些文章:
- 如何构建一个
qgis插件:https://newsn.net/say/qgis-plugin.html - 如果利用
mapTool监控事件:https://newsn.net/say/qgis-plugin-maptool.html - 如何获得坐标值并进行转换:https://newsn.net/say/qgis-plugin-point-transform.html
mapTool中定义signal
现在有个testMapTool.py文件,在mapTool里面定义了一个signal变量。
from PyQt5.QtCore import pyqtSignal
from qgis._core import QgsPointXY
from qgis._gui import QgsMapToolEmitPointclass TestMapTool(QgsMapToolEmitPoint):
capturePointEvent = pyqtSignal(QgsPointXY)
# ...
def __init__(self, iface):
QgsMapToolEmitPoint.__init__(self, iface.mapCanvas())
# ...
def canvasReleaseEvent(self, e):
# ...
pass这里pyqtSignal所承载的返回值是QgsPointXY类型,所以定义为:
pyqtSignal(QgsPointXY)mapTool中提交signal
因为苏南大叔获得的坐标值是从canvasReleaseEvent事件中获取的。所以,这里的signal信息提交事件也是从这里提交的。
# ...
class TestMapTool(QgsMapToolEmitPoint):
capturePointEvent = pyqtSignal(QgsPointXY)
# ...
def canvasReleaseEvent(self, e):
point = self.toMapCoordinates(e.pos())
self.capturePointEvent.emit(point)
# ...核心语句就这么一句话:
newsn.net:这里是【评论】可见内容
外部接收signal
那么,对于mapTool的调用者,也可以继续定义mapTool内的信号有数据返回的时候,所需要的动作。
def uiReset(self):
from .testMapTool import TestMapTool
self.captureCoordinate = TestMapTool(self.iface)
self.captureCoordinate.capturePointEvent.connect(self.capturedPoint)
# ...from PyQt5.QtCore import pyqtSlot @pyqtSlot(QgsPointXY)
def capturedPoint(self, point):
# ...
pass要点有两个:
- 定义完
mapTool之后,及时connect到对应函数 - 相关函数前面有个
@pyqtSlot的槽装饰器语句
槽装饰器
这个槽装饰器的表述方式:
@PyQt5.QtCore.pyqtSlot()或者:
from PyQt5.QtCore import pyqtSlot
# ...
@pyqtSlot()
# ...本文中的信号返回值是QgsPointXY类型的,所以写法是:pyqtSlot(QgsPointXY)。
相关链接
- https://newsn.net/say/qgis-plugin.html
- https://newsn.net/say/qgis-plugin-maptool.html
- https://newsn.net/say/qgis-plugin-point-transform.html
总结
监控鼠标事件之后,就可以获得坐标值。当然坐标值的传回方式和格式,都是可以商量的。更多qgis插件文章,请参考苏南大叔的博客: