¿Comprobar que el mouse haga clic en PyQGIS?

17

Quiero saber cómo buscar un clic del mouse en QGIS. Estoy tratando de escribir un complemento de python y quiero proporcionar una funcionalidad similar a la herramienta "Seleccionar función única" que ya existe en QGIS.

Revisé los documentos api de QGIS y los encontré

QgsMapCanvas::CanvasProperties::mouseButtonDown

Esto suena prometedor. Tengo un objeto QgsMapCanvas pero no puedo ver cómo acceder al atributo mouseButtonDown.

Soy completamente nuevo en la API de QGIS.

    
pregunta robert 03.01.2013 - 08:18

3 respuestas

19

La mejor manera de crear una nueva herramienta como la herramienta Seleccionar única función es heredar de QgsMapTool clase Cuando su herramienta está activa, que se puede configurar usando QgsMapCanvas::setMapTool , cualquier evento de teclado o clic que el lienzo reciba se pasará a su herramienta personalizada.

Aquí hay una clase básica QgsMapTool

class PointTool(QgsMapTool):   
    def __init__(self, canvas):
        QgsMapTool.__init__(self, canvas)
        self.canvas = canvas    

    def canvasPressEvent(self, event):
        pass

    def canvasMoveEvent(self, event):
        x = event.pos().x()
        y = event.pos().y()

        point = self.canvas.getCoordinateTransform().toMapCoordinates(x, y)

    def canvasReleaseEvent(self, event):
        #Get the click
        x = event.pos().x()
        y = event.pos().y()

        point = self.canvas.getCoordinateTransform().toMapCoordinates(x, y)

    def activate(self):
        pass

    def deactivate(self):
        pass

    def isZoomTool(self):
        return False

    def isTransient(self):
        return False

    def isEditTool(self):
        return True

Puedes hacer lo que necesites en canvasReleaseEvent , etc.

Para activar esta herramienta, simplemente hazlo:

tool = PointTool(qgis.iface.mapCanvas())
qgis.iface.mapCanvas().setMapTool(tool)
    
respondido por el Nathan W 03.01.2013 - 12:41
3

Creo que puedes hacer esto con una combinación de usar QGIS "canvasClicked" pero también SIGNAL / SLOTS para lidiar con la respuesta:

result = QObject.connect(self.clickTool, SIGNAL("canvasClicked(const QgsPoint &, Qt::MouseButton)"), self.handleMouseDown)

No lo he intentado pero debería brindarte más información para comenzar a mirar. Hay un tutorial aquí donde alguien está usando esto para crear un complemento muy básico.

    
respondido por el Dan 03.01.2013 - 12:32
1

Intente algo como esto (esto es para seleccionar un punto):

def run(self):
    self.pointEmitter = QgsMapToolEmitPoint(self.iface.mapCanvas())
    QObject.connect( self.pointEmitter, SIGNAL("canvasClicked(const QgsPoint, Qt::MouseButton)"), self.selectNow)
    self.iface.mapCanvas().setMapTool( self.pointEmitter )

def selectNow(self, point, button):
  #QMessageBox.information(None, "Clicked coords", " x: " + str(point.x()) + " Y: " + str(point.y()) )

  layer = self.iface.activeLayer()
  if not layer or layer.type() != QgsMapLayer.VectorLayer:
     QMessageBox.warning(None, "No!", "Select a vector layer")
     return

  width = self.iface.mapCanvas().mapUnitsPerPixel() * 2
  rect = QgsRectangle(point.x() - width,
                      point.y() - width,
                      point.x() + width,
                      point.y() + width)

  rect = self.iface.mapCanvas().mapRenderer().mapToLayerCoordinates(layer, rect)

  layer.select([], rect)
  feat = QgsFeature()

  ids = []
  while layer.nextFeature(feat):
    ids.append( feat.id() )

  layer.setSelectedFeatures( ids )
    
respondido por el André Barriguinha 03.01.2013 - 18:23

Lea otras preguntas en las etiquetas