例として、マウスをクリックした場所のウィンドウ座標と地理座標を出力してみます。
自作のマップツールクラスを作る
まず、マップツールクラスを自作する必要があります。
なんでこうするかというと、QgsMapCanvas
クラスにクリック時に発行されるシグナルがないからです。
ちなみに、マウス移動時に発行されるイベントはあって、xyCoordinates
というシグナルを発行します。
QgsMapTool
クラスのコンストラクタはQgsMapCanvas
オブジェクトを要求します。
このオブジェクトはQgsMapTool
オブジェクトのメンバ変数として格納されます。
MapCanvas上でマウスクリックが発生したら、QgsMapCanvas
オブジェクト内では
現在のマップツールオブジェクトのcanvasPressEvent()
関数を呼び出します。
(QgsMapCanvas::mousePressEvent()
関数内)
なので、この自作ツールクラス内で、canvasPressEvent
関数をオーバーライドすればいいということになります。
とりあえず以下のようなクラスにしてみます。
class QgsMapToolClick(QgsMapTool): def canvasPressEvent(self, event): # ウィンドウ座標を出力 print event.pos() # 地理座標を出力 # 1.0(kore)からはtoMapCoordinats()になってる? print self.toMapCoords(event.pos())
MapToolを登録
あとはQGISがデフォルトで実装しているZoomツールなどと同じ要領でイベントを登録します。
class MainWindow(QMainWindow, Ui_MainWindow): def __init__(self): # ボタン作成、アイコンは本体から拝借 self.actionClick = QAction(QIcon("icons/mActionIdentify.png"), "MapCoordinate", self.frame) # ボタンクリックイベントを登録 self.connect(self.actionClick, SIGNAL("activated()"), self.clicked) # 自作ツールクラスのオブジェクトを作成 self.toolClick = QgsMapToolClick(self.canvas) def clicked(self): # クリック時にマップツールオブジェクトをセット # これにより、QgsMapCanvasオブジェクトの現在のツール # として上記の自作クラスがセットされる self.canvas.setMapTool(self.toolClick)
C++の場合
QGISのバージョン2.12を境にcanvasPressEvent()
等のキャンバスイベント関数の引数が変わっているので注意してください。
ヘッダファイル
1: 2: #include <qgsmaptool.h> 3: 4: class MyMapTool : public QgsMapTool 5: { 6: Q_OBJECT 7: 8: public: 9: 10: MyMapTool( QgsMapCanvas *canvas ); 11: ~MyMapTool(void); 12: 13: /** QGIS ver 2.10以前の場合 */ 14: virtual void canvasPressEvent( QMouseEvent *event ); 15: 16: /** QGIS ver 2.12以降の場合 */ 17: virtual void canvasPressEvent( QgsMapMouseEvent *event ); 18: 19: }; 20:
C++ファイル
1: 2: #include "MapToolSelect.h" 3: #include <qgsmapcanvas.h> 4: 5: 6: MyMapTool::MyMapTool( QgsMapCanvas *canvas ) 7: : QgsMapTool( canvas ) 8: { 9: mCursor = Qt::ArrowCursor; 10: } 11: 12: 13: MyMapTool::~MyMapTool(void) 14: { 15: } 16: 17: 18: void MyMapTool::canvasPressEvent( QgsMapMouseEvent *event ) 19: { 20: /** キャンバスが押されたときの何か処理 */ 21: } 22: