回答:
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)
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
。何か案は?