1

我正在使用 QgsRubberBand、QgsMapCanvas 和 QgsMapToolEmitPoint。结合这三者,我可以成功捕捉到canvasClicked的事件,并在我点击画布时获得我感兴趣的点。我也可以成功地使用 QgsRubberBand 创建点和线,使用鼠标左键单击获取我想要的顶点,连接以制作线,右键单击撤消最后一个点。

我现在需要做的就是在双击时完成我的草图,而不是在画布上单击。我无法将任何信号连接到它,或者即使我这样做了,我也看不到任何东西发出的任何双击信号。我所要求的只是一种从 QgsMapCanvas 发出和识别双击信号的解决方法。

4

1 回答 1

0

QgsMapToolEmitPoint 类继承QgsMapTool,而QgsMapTool 又具有canvasDoubleClickEvent方法。此方法是虚拟的,因此您可以在子类中重新实现它并发出自定义信号。尝试这样的事情:

class MapToolEmitPoint(QgsMapToolEmitPoint):
    canvasDoubleClicked = QtCore.pyqtSignal(object, object)

    def canvasDoubleClickEvent(self, event):
        point = self.toMapCoordinates(event.pos())            
        self.canvasDoubleClicked.emit(point, event.button())
        super(MapToolEmitPoint, self).canvasDoubleClickEvent(event)

canvasDoubleClicked信号已被赋予与现有信号相同的签名canvasClicked,因此您应该能够以相同的方式使用它。

编辑

为了清楚起见,上面的类打算像这样使用:

        maptool = MapToolEmitPoint(self.canvas)
        self.canvas.setMapTool(maptool)
        maptool.canvasDoubleClicked.connect(self.handleDoubleClick)
        ....

    def handleDoubleClick(self, point, buttons):
        # do stuff with point and buttons
        ...
于 2013-11-14T18:33:49.353 回答