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 QgsMapToolEmitPoint
class 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)
# ...
核心语句就这么一句话:
seosn.com:这里是【评论】可见内容
外部接收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
插件文章,请参考苏南大叔的博客:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。