PyQGISでマウスクリックをプログラムで確認しますか?


19

QGISでマウスクリックをチェックする方法を知りたいです。Pythonプラグインを作成しようとしていますが、QGISに既に存在する「Select Single Feature」ツールに似た機能を提供したいと考えています。

QGIS APIドキュメントを確認しました

QgsMapCanvas::CanvasProperties::mouseButtonDown

これは有望に思えます。QgsMapCanvasオブジェクトを持っていますが、mouseButtonDown属性にアクセスする方法がわかりません。

私はQGIS APIを初めて使用します。

回答:


23

Select Single Featureツールのような新しいツールを作成する最良の方法は、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。何か案は?
ロバート

1
from qgis.gui import QgsMapToolトップで使用する必要があります
ネイサンW

最後の質問...このツールを無効にするにはどうすればよいですか?
ロバート

maptoolを他の何か、またはに設定しNoneます。QgsMapCanvas.mapTool()完了したら、ユーザーが選択したものを復元して保存します。
ネイサンW

@NathanW「maptoolを別のものに設定する」ということは、ツールバーの「パンマップ」をクリックすることも意味しますか?
wannik 14年

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)
ネイサン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)構文がずっときれいなので、信号に接続するために構文を使用します。
ネイサンW
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.