书接上文,苏南大叔利用mapTool对鼠标事件进行监控,进而拿到了坐标值。现在,新的问题来了:拿到的坐标值,如何传递回主界面呢?

苏南大叔:qgis插件开发:如何利用信号/槽从maptool传回点信息? - qgis-plugin-pyqtsignal
qgis插件开发:如何利用信号/槽从maptool传回点信息?(图1-1)

拿到坐标值的这个动作,是监控鼠标事件获得的。随时都会触发,并不是普通的函数返回值这样操作就可以搞定的。本文的解决方案使用了pyqtSignal这个概念,具体上来说,就是:信号和槽函数。

测试环境:win10qgis@3.16.14-hannover

前文回顾:

本文的顺利阅读,可能需要您先熟悉下面这些文章:

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)
    # ...

核心语句就这么一句话:

self.capturePointEvent.emit(point)
  • capturePointEvent是信号名字
  • point是返回的数据
  • emit是返回函数

外部接收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)

相关链接

总结

监控鼠标事件之后,就可以获得坐标值。当然坐标值的传回方式和格式,都是可以商量的。更多qgis插件文章,请参考苏南大叔的博客:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。