QGIS API Documentation  3.8.0-Zanzibar (11aff65)
qgsmaptool.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsmaptool.cpp - base class for map canvas tools
3  ----------------------
4  begin : January 2006
5  copyright : (C) 2006 by Martin Dobias
6  email : wonder.sk at gmail dot com
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
16 #include "qgslogger.h"
17 #include "qgsmaptool.h"
18 #include "qgsmapcanvas.h"
19 #include "qgsmaptopixel.h"
20 #include "qgsrendercontext.h"
21 #include "qgssettings.h"
22 #include "qgsmapmouseevent.h"
23 
24 #include <QAction>
25 #include <QAbstractButton>
26 
28  : QObject( canvas )
29  , mCanvas( canvas )
30  , mCursor( Qt::CrossCursor )
31 {
32 }
33 
34 
36 {
37  if ( mCanvas )
38  mCanvas->unsetMapTool( this );
39 }
40 
41 
43 {
45 }
46 
48 {
49  QgsPointXY result = mCanvas->mapSettings().layerToMapCoordinates( layer, QgsPointXY( point.x(), point.y() ) );
50  return QgsPoint( result );
51 }
52 
53 
55 {
56  QgsPointXY pt = toMapCoordinates( point );
57  return toLayerCoordinates( layer, pt );
58 }
59 
61 {
62  return mCanvas->mapSettings().mapToLayerCoordinates( layer, point );
63 }
64 
66 {
67  return mCanvas->mapSettings().layerToMapCoordinates( layer, point );
68 }
69 
71 {
72  return mCanvas->mapSettings().mapToLayerCoordinates( layer, rect );
73 }
74 
76 {
77  qreal x = point.x(), y = point.y();
79  return QPoint( std::round( x ), std::round( y ) );
80 }
81 
82 
84 {
85  // make action and/or button active
86  if ( mAction )
87  mAction->setChecked( true );
88  if ( mButton )
89  mButton->setChecked( true );
90 
91  // set cursor (map tools usually set it in constructor)
92  mCanvas->setCursor( mCursor );
93  QgsDebugMsg( QStringLiteral( "Cursor has been set" ) );
94 
95  emit activated();
96 }
97 
98 
100 {
101  if ( mAction )
102  mAction->setChecked( false );
103  if ( mButton )
104  mButton->setChecked( false );
105 
106  emit deactivated();
107 }
108 
110 {
111 
112 }
113 
115 {
116  if ( mAction )
117  disconnect( mAction, &QObject::destroyed, this, &QgsMapTool::actionDestroyed );
118  mAction = action;
119  if ( mAction )
120  connect( mAction, &QObject::destroyed, this, &QgsMapTool::actionDestroyed );
121 }
122 
123 void QgsMapTool::actionDestroyed()
124 {
125  if ( mAction == sender() )
126  mAction = nullptr;
127 }
128 
130 {
131  return mAction;
132 }
133 
135 {
136  return mCanvas && mCanvas->mapTool() == this;
137 }
138 
139 void QgsMapTool::setButton( QAbstractButton *button )
140 {
141  mButton = button;
142 }
143 
144 QAbstractButton *QgsMapTool::button()
145 {
146  return mButton;
147 }
148 
149 void QgsMapTool::setCursor( const QCursor &cursor )
150 {
151  mCursor = cursor;
152  if ( isActive() )
153  mCanvas->setCursor( mCursor );
154 }
155 
156 
158 {
159  Q_UNUSED( e )
160 }
161 
163 {
164  Q_UNUSED( e )
165 }
166 
168 {
169  Q_UNUSED( e )
170 }
171 
173 {
174  Q_UNUSED( e )
175 }
176 
177 void QgsMapTool::wheelEvent( QWheelEvent *e )
178 {
179  e->ignore();
180 }
181 
182 void QgsMapTool::keyPressEvent( QKeyEvent *e )
183 {
184  Q_UNUSED( e )
185 }
186 
187 void QgsMapTool::keyReleaseEvent( QKeyEvent *e )
188 {
189  Q_UNUSED( e )
190 }
191 
192 bool QgsMapTool::gestureEvent( QGestureEvent *e )
193 {
194  Q_UNUSED( e )
195  return true;
196 }
197 
199 {
200  return mCanvas;
201 }
202 
204 {
205  QgsSettings settings;
206  double radius = settings.value( QStringLiteral( "Map/searchRadiusMM" ), Qgis::DEFAULT_SEARCH_RADIUS_MM ).toDouble();
207 
208  if ( radius > 0 )
209  {
210  return radius;
211  }
213 }
214 
216 {
217  return searchRadiusMM() * context.scaleFactor() * context.mapToPixel().mapUnitsPerPixel();
218 }
219 
221 {
222  if ( !canvas )
223  {
224  return 0;
225  }
226  QgsMapSettings mapSettings = canvas->mapSettings();
227  QgsRenderContext context = QgsRenderContext::fromMapSettings( mapSettings );
228  return searchRadiusMU( context );
229 }
void unsetMapTool(QgsMapTool *mapTool)
Unset the current map tool or last non zoom tool.
A rectangle specified with double values.
Definition: qgsrectangle.h:41
Base class for all map layer types.
Definition: qgsmaplayer.h:78
double y
Definition: qgspoint.h:42
virtual void canvasMoveEvent(QgsMapMouseEvent *e)
Mouse move event for overriding. Default implementation does nothing.
Definition: qgsmaptool.cpp:157
static double searchRadiusMU(const QgsRenderContext &context)
Gets search radius in map units for given context.
Definition: qgsmaptool.cpp:215
QAbstractButton * button()
Returns associated button with map tool or nullptr if no button is associated.
Definition: qgsmaptool.cpp:144
This class is a composition of two QSettings instances:
Definition: qgssettings.h:58
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
#define QgsDebugMsg(str)
Definition: qgslogger.h:38
double y
Definition: qgspointxy.h:48
A class to represent a 2D point.
Definition: qgspointxy.h:43
QAbstractButton * mButton
optionally map tool can have pointer to a button which will be used to set that action as active ...
Definition: qgsmaptool.h:256
~QgsMapTool() override
Definition: qgsmaptool.cpp:35
A QgsMapMouseEvent is the result of a user interaction with the mouse on a QgsMapCanvas.
QgsPointXY toMapCoordinates(QPoint point)
transformation from screen coordinates to map coordinates
Definition: qgsmaptool.cpp:42
QgsMapTool * mapTool()
Returns the currently active tool.
Map canvas is a class for displaying all GIS data types on a canvas.
Definition: qgsmapcanvas.h:73
virtual void canvasPressEvent(QgsMapMouseEvent *e)
Mouse press event for overriding. Default implementation does nothing.
Definition: qgsmaptool.cpp:167
void setButton(QAbstractButton *button)
Use this to associate a button to this maptool.
Definition: qgsmaptool.cpp:139
The QgsMapSettings class contains configuration for rendering of the map.
void transformInPlace(double &x, double &y) const
Transform device coordinates to map coordinates.
virtual void activate()
called when set as currently active map tool
Definition: qgsmaptool.cpp:83
QgsMapCanvas * mCanvas
pointer to map canvas
Definition: qgsmaptool.h:241
virtual void keyReleaseEvent(QKeyEvent *e)
Key event for overriding. Default implementation does nothing.
Definition: qgsmaptool.cpp:187
QCursor mCursor
cursor used in map tool
Definition: qgsmaptool.h:244
QgsMapCanvas * canvas()
returns pointer to the tool&#39;s map canvas
Definition: qgsmaptool.cpp:198
void setAction(QAction *action)
Use this to associate a QAction to this maptool.
Definition: qgsmaptool.cpp:114
static const double DEFAULT_SEARCH_RADIUS_MM
Identify search radius in mm.
Definition: qgis.h:100
virtual void deactivate()
called when map tool is being deactivated
Definition: qgsmaptool.cpp:99
double mapUnitsPerPixel() const
Returns current map units per pixel.
virtual void wheelEvent(QWheelEvent *e)
Mouse wheel event for overriding. Default implementation does nothing.
Definition: qgsmaptool.cpp:177
Point geometry type, with support for z-dimension and m-values.
Definition: qgspoint.h:37
void activated()
signal emitted once the map tool is activated
double x
Definition: qgspointxy.h:47
bool isActive() const
Returns if the current map tool active on the map canvas.
Definition: qgsmaptool.cpp:134
QAction * action()
Returns associated action with map tool or nullptr if no action is associated.
Definition: qgsmaptool.cpp:129
virtual void keyPressEvent(QKeyEvent *e)
Key event for overriding. Default implementation does nothing.
Definition: qgsmaptool.cpp:182
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
Contains information about the context of a rendering operation.
QgsPointXY toLayerCoordinates(const QgsMapLayer *layer, QPoint point)
transformation from screen coordinates to layer&#39;s coordinates
Definition: qgsmaptool.cpp:54
void deactivated()
signal emitted once the map tool is deactivated
const QgsMapToPixel & mapToPixel() const
Returns the context&#39;s map to pixel transform, which transforms between map coordinates and device coo...
virtual bool gestureEvent(QGestureEvent *e)
gesture event for overriding. Default implementation does nothing.
Definition: qgsmaptool.cpp:192
virtual void canvasDoubleClickEvent(QgsMapMouseEvent *e)
Mouse double-click event for overriding. Default implementation does nothing.
Definition: qgsmaptool.cpp:162
QgsPointXY layerToMapCoordinates(const QgsMapLayer *layer, QgsPointXY point) const
transform point coordinates from layer&#39;s CRS to output CRS
static QgsRenderContext fromMapSettings(const QgsMapSettings &mapSettings)
create initialized QgsRenderContext instance from given QgsMapSettings
QAction * mAction
optionally map tool can have pointer to action which will be used to set that action as active ...
Definition: qgsmaptool.h:250
const QgsMapToPixel * getCoordinateTransform()
Gets the current coordinate transform.
virtual void setCursor(const QCursor &cursor)
Sets a user defined cursor.
Definition: qgsmaptool.cpp:149
QgsMapTool(QgsMapCanvas *canvas)
constructor takes map canvas as a parameter
Definition: qgsmaptool.cpp:27
QgsPointXY mapToLayerCoordinates(const QgsMapLayer *layer, QgsPointXY point) const
transform point coordinates from output CRS to layer&#39;s CRS
double scaleFactor() const
Returns the scaling factor for the render to convert painter units to physical sizes.
QPoint toCanvasCoordinates(const QgsPointXY &point)
transformation from map coordinates to screen coordinates
Definition: qgsmaptool.cpp:75
virtual void clean()
convenient method to clean members
Definition: qgsmaptool.cpp:109
QgsPointXY toMapCoordinates(int x, int y) const
Transform device coordinates to map (world) coordinates.
static double searchRadiusMM()
Gets search radius in mm.
Definition: qgsmaptool.cpp:203
double x
Definition: qgspoint.h:41
virtual void canvasReleaseEvent(QgsMapMouseEvent *e)
Mouse release event for overriding. Default implementation does nothing.
Definition: qgsmaptool.cpp:172