La mejor manera de crear una nueva herramienta como la herramienta Seleccionar característica única es heredar de la QgsMapTool
clase. Cuando su herramienta está activa, que se puede configurar usando QgsMapCanvas::setMapTool
, cualquier teclado o evento de clic que obtenga el lienzo se pasará a su herramienta personalizada.
Aquí hay una QgsMapTool
clase básica
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 canvasReleaseEvent
, etc.
Para configurar esta herramienta activa, simplemente haga lo siguiente:
tool = PointTool(qgis.iface.mapCanvas())
qgis.iface.mapCanvas().setMapTool(tool)
class PointTool(QgsMapTool): NameError: name 'QgsMapTool' is not defined
. ¿Algunas ideas?from qgis.gui import QgsMapTool
en la parte superiorNone
. Guardaría lo que el usuario había seleccionado alQgsMapCanvas.mapTool()
restaurarlo después de que haya terminado.Creo que puede hacer esto con una combinación de usar QGIS "canvasClicked" pero también SEÑAL / RANURAS para lidiar con la respuesta:
No lo he intentado, pero debería darle más información para comenzar a mirar. Aquí hay un tutorial en el que alguien está usando esto para crear un complemento muy básico.
fuente
QgsMapToolEmitPoint
clase integrada que le dará el comienzo básico para una herramienta. Una buena forma de conectarse a las señales en PyQt es usar esta sintaxisself.clickTool.canvasClicked.connect(self.handleMouseDown)
Pruebe algo como esto (esto es para seleccionar un punto):
fuente
self.clickTool.canvasClicked.connect(self.handleMouseDown)
Usaría la sintaxis para conectarme a las señales, ya que es mucho más limpia.