【问题标题】:Emit and catch double-click signals from QgsMapCanvas从 QgsMapCanvas 发出和捕获双击信号
【发布时间】:2013-11-16 01:52:28
【问题描述】:

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

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

【问题讨论】:

  • 到目前为止你做了什么?
  • 好吧,我试图从 mapCanvas 连接 keydown 事件,但它什么也没做,我也试图重载 QgsClickTool doubleClickEvent,但它也失败了。我可以稍后提供更多信息,我仍在努力。似乎画布没有发出 keyDownEvent

标签: python canvas pyqt double-click qgis


【解决方案1】:

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

【讨论】:

  • 您在此处使用的事件应该是 QgsPoint 和 Qt.MouseButton,但事实并非如此。为了获得当我将工具与函数连接时发送的 Qt.MouseButton,我必须再传递一个参数,这稍后会给我下一个错误。 “TypeError:canvasDoubleClickEvent() 正好需要 3 个参数(给定 2 个)”@ekhumoro
  • 从这个:("def canvasDoubleClickEvent(self, event):") 我把它改成了这个"("def canvasDoubleClickEvent(self,inc_point,inc_button):")
  • @dterpas。不。您似乎对事件和信号之间的区别感到困惑,它们是完全不同的机制。要使用我的示例代码,您需要连接到自定义信号 canvasDoubleClicked,它发送 QgsPoint 和 MouseButtons(即就像现有的 canvasClicked 信号一样)。请参阅我的更新答案以获得澄清。
  • 感谢您的回答,我发现了我的问题。您的答案是通用版本。为了使它工作,我不得不对其进行一些修改。我正在使用 QObject.connect(self.clickTool, SIGNAL("canvasDoubleClicked(const QgsPoint &, Qt::MouseButton)"), self.addLineToSplit) 但它没有像我想要的那样工作。用你的那种连接就好了。
  • 如果您想编辑您的代码,我进行了下一个更改以使其正常工作。该事件是一个 QgsPoint,所以我必须使用以下方法将其转换为一个 QPoint:point= self.toMapCoordinates(QPoint(event.x(),event.y()))。为了使用 event.button() 你说我必须使用:mouseButton = Qt.LeftButton 制作我自己的鼠标按钮,至少对于你发送的“事件”我必须创建这个:q_Event = QMouseEvent(QEvent. MouseButtonDblClick,QPoint(event.x(),event.y()),mouseButton,Qt.MouseButtons(1),Qt.KeyboardModifiers(1)) super(MapToolEmitPoint,self).canvasDoubleClickEvent(q_Event)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多