답변:
단일 기능 선택 도구와 같은 새 도구를 만드는 가장 좋은 방법은 QgsMapTool
클래스 에서 상속하는 것 입니다. 를 사용하여 설정할 수있는 도구가 활성화되면 QgsMapCanvas::setMapTool
캔버스가받는 키보드 또는 클릭 이벤트가 사용자 정의 도구로 전달됩니다.
기본 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
canvasReleaseEvent
등에서 필요한 것을 할 수 있습니다.
이 도구를 활성화하려면 다음을 수행하십시오.
tool = PointTool(qgis.iface.mapCanvas())
qgis.iface.mapCanvas().setMapTool(tool)
from qgis.gui import QgsMapTool
상단에서 사용해야 합니다
None
. QgsMapCanvas.mapTool()
당신이 끝나면 복원을 사용하여 사용자가 선택한 것을 저장 합니다.
QGIS "canvasClicked"와 SIGNAL / SLOTS를 사용하여 응답을 처리하는 방법 으로이 작업을 수행 할 수 있다고 생각합니다.
result = QObject.connect(self.clickTool, SIGNAL("canvasClicked(const QgsPoint &, Qt::MouseButton)"), self.handleMouseDown)
시도하지는 않았지만 살펴볼 추가 정보를 제공해야합니다. 이 여기에 튜토리얼 사람이 아주 기본적인 플러그인을 구축하려면이 옵션을 사용하고 있습니다.
QgsMapToolEmitPoint
클래스를 사용하여 도구의 기본 시작을 제공합니다. PyQt에서 신호에 연결하는 좋은 방법은이 구문을 사용하는 것입니다self.clickTool.canvasClicked.connect(self.handleMouseDown)
다음과 같이 해보십시오 (점을 선택하는 것입니다).
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 )
self.clickTool.canvasClicked.connect(self.handleMouseDown)
훨씬 청소기의로 신호를 연결하는 구문을.
class PointTool(QgsMapTool): NameError: name 'QgsMapTool' is not defined
합니다. 어떤 아이디어?