프로그래밍 방식으로 PyQGIS에서 마우스 클릭을 확인 하시겠습니까?


19

QGIS에서 마우스 클릭을 확인하는 방법을 알고 싶습니다. 파이썬 플러그인을 작성하려고하는데 QGIS에 이미 존재하는 "단일 기능 선택"도구와 유사한 기능을 제공하려고합니다.

QGIS API 문서를 확인한 후

QgsMapCanvas::CanvasProperties::mouseButtonDown

유망한 소리. QgsMapCanvas 객체가 있지만 mouseButtonDown 속성에 액세스하는 방법을 볼 수 없습니다.

QGIS API를 완전히 처음 사용합니다.

답변:


23

단일 기능 선택 도구와 같은 새 도구를 만드는 가장 좋은 방법은 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)

당신의 응답을 주셔서 감사합니다. 정확히 내가 필요한 것입니다. 그러나이 솔루션을 구현하려고하면 다음 오류가 발생 class PointTool(QgsMapTool): NameError: name 'QgsMapTool' is not defined합니다. 어떤 아이디어?
robert

1
from qgis.gui import QgsMapTool상단에서 사용해야 합니다
Nathan W

마지막 질문 ...이 도구를 어떻게 비활성화합니까?
robert

maptool을 다른 것으로 또는로 설정하십시오 None. QgsMapCanvas.mapTool()당신이 끝나면 복원을 사용하여 사용자가 선택한 것을 저장 합니다.
Nathan W

@NathanW "maptool을 다른 것으로 설정하는 것"은 툴바에서 'Pan Map'을 클릭한다는 의미입니까?
wannik

3

QGIS "canvasClicked"와 SIGNAL / SLOTS를 사용하여 응답을 처리하는 방법 으로이 작업을 수행 할 수 있다고 생각합니다.

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

시도하지는 않았지만 살펴볼 추가 정보를 제공해야합니다. 이 여기에 튜토리얼 사람이 아주 기본적인 플러그인을 구축하려면이 옵션을 사용하고 있습니다.


1
그들은 내장 QgsMapToolEmitPoint클래스를 사용하여 도구의 기본 시작을 제공합니다. PyQt에서 신호에 연결하는 좋은 방법은이 구문을 사용하는 것입니다self.clickTool.canvasClicked.connect(self.handleMouseDown)
Nathan W

1

다음과 같이 해보십시오 (점을 선택하는 것입니다).

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)훨씬 청소기의로 신호를 연결하는 구문을.
Nathan W
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.