75#include <QApplication>
80#include <QGraphicsItem>
81#include <QGraphicsScene>
82#include <QGraphicsView>
88#include <QPropertyAnimation>
90#include <QResizeEvent>
95#include <QVariantAnimation>
100#include "moc_qgsmapcanvas.cpp"
132 : QGraphicsView( parent )
134 , mExpressionContextScope( tr(
"Map Canvas" ) )
136 mScene =
new QGraphicsScene();
138 setLayout( mLayout );
141 setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
142 setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
143 setMouseTracking(
true );
144 setFocusPolicy( Qt::StrongFocus );
149 mResizeTimer =
new QTimer(
this );
150 mResizeTimer->setSingleShot(
true );
153 mRefreshTimer =
new QTimer(
this );
154 mRefreshTimer->setSingleShot(
true );
155 connect( mRefreshTimer, &QTimer::timeout,
this, &QgsMapCanvas::refreshMap );
158 mMap =
new QgsMapCanvasMap(
this );
196 if ( mSettings.destinationCrs() != crs )
212 double segmentationTolerance = settings.
value( QStringLiteral(
"qgis/segmentationTolerance" ),
"0.01745" ).toDouble();
214 mSettings.setSegmentationTolerance( segmentationTolerance );
215 mSettings.setSegmentationToleranceType( toleranceType );
217 mWheelZoomFactor = settings.
value( QStringLiteral(
"qgis/zoom_factor" ), 2 ).toDouble();
219 QSize s = viewport()->size();
220 mSettings.setOutputSize( s );
224 setSceneRect( 0, 0, s.width(), s.height() );
225 mScene->setSceneRect( QRectF( 0, 0, s.width(), s.height() ) );
229 connect( &mMapUpdateTimer, &QTimer::timeout,
this, &QgsMapCanvas::mapUpdateTimeout );
230 mMapUpdateTimer.setInterval( 250 );
235 grabGesture( Qt::PinchGesture );
236 grabGesture( Qt::TapAndHoldGesture );
237 viewport()->setAttribute( Qt::WA_AcceptTouchEvents );
241 viewport()->setGraphicsEffect( mPreviewEffect );
245 connect( &mAutoRefreshTimer, &QTimer::timeout,
this, &QgsMapCanvas::autoRefreshTriggered );
249 setInteractive(
false );
264 mMapTool->deactivate();
265 disconnect( mMapTool, &QObject::destroyed,
this, &QgsMapCanvas::mapToolDestroyed );
273 const QList<QgsMapTool *> tools = findChildren<QgsMapTool *>();
276 tool->mCanvas =
nullptr;
284 qDeleteAll( mScene->items() );
286 mScene->deleteLater();
293 mLayout->addWidget( widget, edge );
307 for (
auto previewJob = mPreviewJobs.constBegin(); previewJob != mPreviewJobs.constEnd(); ++previewJob )
315 mPreviewJobs.clear();
323 factor = std::clamp( factor, magnifierMin, magnifierMax );
326 if ( !
qgsDoubleNear( factor, mSettings.magnificationFactor(), 0.01 ) )
328 mSettings.setMagnificationFactor( factor,
center );
336 return mSettings.magnificationFactor();
358 if ( index >= 0 && index <
layers.size() )
381 if ( mCurrentLayer ==
layer )
384 mCurrentLayer =
layer;
395 return nullptr != mJob;
408 if ( !mTheme.isEmpty() )
411 setLayersPrivate(
layers );
424void QgsMapCanvas::setLayersPrivate(
const QList<QgsMapLayer *> &layers )
426 const QList<QgsMapLayer *> oldLayers = mSettings.
layers();
429 if (
layers == oldLayers )
448 QgsVectorTileLayer *vtlayer = qobject_cast<QgsVectorTileLayer *>(
layer );
464 mSettings.setLayers(
layers );
466 for ( QgsMapLayer *
layer : std::as_const(
layers ) )
473 switch (
layer->type() )
477 QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>(
layer );
485 QgsVectorTileLayer *vtlayer = qobject_cast<QgsVectorTileLayer *>(
layer );
504 updateAutoRefreshTimer();
521 if ( mSettings.destinationCrs() == crs )
526 if ( !mSettings.visibleExtent().isEmpty() )
543 mBlockExtentChangedSignal++;
544 mBlockScaleChangedSignal++;
550 mBlockItemPositionUpdates++;
552 mBlockItemPositionUpdates--;
555 mBlockExtentChangedSignal--;
556 mBlockScaleChangedSignal--;
558 mSettings.setDestinationCrs( crs );
564 QgsDebugMsgLevel( QStringLiteral(
"refreshing after destination CRS changed" ), 2 );
580 mSettings.setFrameRate( -1 );
581 mSettings.setCurrentFrame( -1 );
584 mController = controller;
590void QgsMapCanvas::temporalControllerModeChanged()
594 switch ( temporalNavigationObject->navigationMode() )
598 mSettings.
setFrameRate( temporalNavigationObject->framesPerSecond() );
599 mSettings.
setCurrentFrame( temporalNavigationObject->currentFrameNumber() );
620 mSettings.setFlags(
flags );
627 if ( !allowOutdatedResults && mLabelingResultsOutdated )
630 return mLabelingResults.get();
635 if ( !allowOutdatedResults && mRenderedItemResultsOutdated )
638 return mRenderedItemResults.get();
646 if ( mJob && mJob->isActive() )
649 mJob->waitForFinished();
661 mPreviousRenderedItemResults.reset();
666 return nullptr != mCache;
674 if ( mPreviousRenderedItemResults )
675 mPreviousRenderedItemResults.reset();
676 if ( mRenderedItemResults )
677 mRenderedItemResults.reset();
687 mUseParallelRendering = enabled;
692 return mUseParallelRendering;
697 mMapUpdateTimer.setInterval( timeMilliseconds );
702 return mMapUpdateTimer.interval();
708 return mCurrentLayer;
728 expressionContext << generator->createExpressionContextScope();
732 return expressionContext;
737 if ( !mSettings.hasValidSettings() )
739 QgsDebugMsgLevel( QStringLiteral(
"CANVAS refresh - invalid settings -> nothing to do" ), 2 );
743 if ( !mRenderFlag || mFrozen )
749 if ( mRefreshScheduled )
751 QgsDebugMsgLevel( QStringLiteral(
"CANVAS refresh already scheduled" ), 2 );
755 mRefreshScheduled =
true;
760 mRefreshTimer->start( 1 );
762 mLabelingResultsOutdated =
true;
763 mRenderedItemResultsOutdated =
true;
768 QList<QgsMapLayer *> filteredLayers;
771 if (
QgsAnnotationLayer *annotationLayer = qobject_cast<QgsAnnotationLayer *>( layer ) )
773 if (
QgsMapLayer *linkedLayer = annotationLayer->linkedVisibilityLayer() )
775 if ( !layers.contains( linkedLayer ) )
779 filteredLayers.append( layer );
783 filteredLayers.erase( std::remove_if( filteredLayers.begin(), filteredLayers.end(), [](
QgsMapLayer *layer ) {
784 return !layer || !layer->isValid();
786 filteredLayers.end() );
788 return filteredLayers;
791void QgsMapCanvas::refreshMap()
793 Q_ASSERT( mRefreshScheduled );
800 if ( mCacheInvalidations.testFlag( CacheInvalidationType::Temporal ) )
802 clearTemporalCache();
803 mCacheInvalidations &= ~(
static_cast<int>( CacheInvalidationType::Temporal ) );
805 if ( mCacheInvalidations.testFlag( CacheInvalidationType::Elevation ) )
807 clearElevationCache();
808 mCacheInvalidations &= ~(
static_cast<int>( CacheInvalidationType::Elevation ) );
814 if ( QgsTemporalNavigationObject *temporalNavigationObject =
dynamic_cast<QgsTemporalNavigationObject *
>( mController ) )
816 switch ( temporalNavigationObject->navigationMode() )
820 mSettings.setFrameRate( temporalNavigationObject->framesPerSecond() );
821 mSettings.setCurrentFrame( temporalNavigationObject->currentFrameNumber() );
832 if ( !mTheme.isEmpty() )
840 mSettings.setLayerStyleOverrides(
QgsProject::instance()->mapThemeCollection()->mapThemeStyleOverrides( mTheme ) );
844 QgsMapSettings renderSettings = mSettings;
845 QList<QgsMapLayer *> allLayers = renderSettings.
layers();
856 mJobCanceled =
false;
857 if ( mUseParallelRendering )
858 mJob =
new QgsMapRendererParallelJob( renderSettings );
860 mJob =
new QgsMapRendererSequentialJob( renderSettings );
863 mJob->setCache( mCache );
864 mJob->setLayerRenderingTimeHints( mLastLayerRenderTime );
874 mRefreshScheduled =
false;
876 mMapUpdateTimer.start();
881void QgsMapCanvas::mapThemeChanged(
const QString &theme )
883 if (
theme == mTheme )
888 setLayersPrivate(
QgsProject::instance()->mapThemeCollection()->mapThemeVisibleLayers( mTheme ) );
901void QgsMapCanvas::mapThemeRenamed(
const QString &theme,
const QString &newTheme )
903 if ( mTheme.isEmpty() ||
theme != mTheme )
912void QgsMapCanvas::rendererJobFinished()
914 QgsDebugMsgLevel( QStringLiteral(
"CANVAS finish! %1" ).arg( !mJobCanceled ), 2 );
916 mMapUpdateTimer.stop();
918 notifyRendererErrors( mJob->errors() );
924 if ( !mJob->usedCachedLabels() )
926 mLabelingResults.reset( mJob->takeLabelingResults() );
928 mLabelingResultsOutdated =
false;
930 std::unique_ptr<QgsRenderedItemResults>
renderedItemResults( mJob->takeRenderedItemResults() );
932 if ( mRenderedItemResults )
934 renderedItemResults->transferResults( mRenderedItemResults.get(), mJob->layersRedrawnFromCache() );
936 if ( mPreviousRenderedItemResults )
939 renderedItemResults->transferResults( mPreviousRenderedItemResults.get(), mJob->layersRedrawnFromCache() );
942 if ( mCache && !mPreviousRenderedItemResults )
943 mPreviousRenderedItemResults = std::make_unique<QgsRenderedItemResults>( mJob->mapSettings().extent() );
945 if ( mRenderedItemResults && mPreviousRenderedItemResults )
950 mPreviousRenderedItemResults->transferResults( mRenderedItemResults.get() );
952 if ( mPreviousRenderedItemResults )
954 mPreviousRenderedItemResults->eraseResultsFromLayers( mJob->mapSettings().layerIds() );
958 mRenderedItemResultsOutdated =
false;
960 QImage img = mJob->renderedImage();
968 QString logMsg = tr(
"Canvas refresh: %1 ms" ).arg( mJob->renderingTime() );
972 if ( mDrawRenderingStats )
974 int w = img.width(), h = img.height();
975 QFont fnt = p.font();
978 int lh = p.fontMetrics().height() * 2;
979 QRect r( 0, h - lh, w, lh );
980 p.setPen( Qt::NoPen );
981 p.setBrush( QColor( 0, 0, 0, 110 ) );
983 p.setPen( Qt::white );
984 QString msg = QStringLiteral(
"%1 :: %2 ms" ).arg( mUseParallelRendering ? QStringLiteral(
"PARALLEL" ) : QStringLiteral(
"SEQUENTIAL" ) ).arg( mJob->renderingTime() );
985 p.drawText( r, msg, QTextOption( Qt::AlignCenter ) );
990 mMap->setContent( img, imageRect( img, mSettings ) );
992 mLastLayerRenderTime.clear();
993 const auto times = mJob->perLayerRenderingTime();
994 for (
auto it = times.constBegin(); it != times.constEnd(); ++it )
996 mLastLayerRenderTime.insert( it.key()->id(), it.value() );
998 if ( mUsePreviewJobs && !mRefreshAfterJob )
1003 mRefreshAfterJob =
false;
1008 mJob->deleteLater();
1013 if ( mRefreshAfterJob )
1015 mRefreshAfterJob =
false;
1020void QgsMapCanvas::previewJobFinished()
1022 QgsMapRendererQImageJob *job = qobject_cast<QgsMapRendererQImageJob *>( sender() );
1028 mPreviewJobs.removeAll( job );
1030 int number = job->property(
"number" ).toInt();
1033 startPreviewJob( number + 1 );
1044 const QgsMapToPixel &m2p =
mapSettings.mapToPixel();
1048 if ( img.devicePixelRatio() !=
mapSettings.devicePixelRatio() )
1050 QgsLogger::warning( QStringLiteral(
"The renderer map has a wrong device pixel ratio" ) );
1054 QgsRectangle rect( topLeft.
x(), topLeft.
y(), topLeft.
x() + img.width() * res, topLeft.
y() - img.height() * res );
1060 return mUsePreviewJobs;
1065 mUsePreviewJobs = enabled;
1070 mDropHandlers = handlers;
1073void QgsMapCanvas::clearTemporalCache()
1077 bool invalidateLabels =
false;
1081 bool alreadyInvalidatedThisLayer =
false;
1089 alreadyInvalidatedThisLayer =
true;
1095 if (
layer->temporalProperties() &&
layer->temporalProperties()->isActive() )
1097 if ( QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>(
layer ) )
1100 invalidateLabels =
true;
1106 if ( !alreadyInvalidatedThisLayer )
1108 mCache->invalidateCacheForLayer(
layer );
1111 else if ( QgsGroupLayer *gl = qobject_cast<QgsGroupLayer *>(
layer ) )
1113 const QList<QgsMapLayer *> childLayerList = gl->childLayers();
1114 for ( QgsMapLayer *childLayer : childLayerList )
1116 if ( childLayer->temporalProperties() && childLayer->temporalProperties()->isActive() )
1121 mCache->invalidateCacheForLayer(
layer );
1128 if ( invalidateLabels )
1130 mCache->clearCacheImage( QStringLiteral(
"_labels_" ) );
1131 mCache->clearCacheImage( QStringLiteral(
"_preview_labels_" ) );
1136void QgsMapCanvas::clearElevationCache()
1140 bool invalidateLabels =
false;
1142 for ( QgsMapLayer *
layer : layerList )
1144 if (
layer->elevationProperties() &&
layer->elevationProperties()->hasElevation() )
1146 if ( QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>(
layer ) )
1149 invalidateLabels =
true;
1155 mCache->invalidateCacheForLayer(
layer );
1157 else if ( QgsGroupLayer *gl = qobject_cast<QgsGroupLayer *>(
layer ) )
1159 const QList<QgsMapLayer *> childLayerList = gl->childLayers();
1160 for ( QgsMapLayer *childLayer : childLayerList )
1162 if ( childLayer->elevationProperties() && childLayer->elevationProperties()->hasElevation() )
1167 mCache->invalidateCacheForLayer(
layer );
1174 if ( invalidateLabels )
1176 mCache->clearCacheImage( QStringLiteral(
"_labels_" ) );
1177 mCache->clearCacheImage( QStringLiteral(
"_preview_labels_" ) );
1184 const QgsPointXY mapPoint =
event->originalMapPoint();
1188 QMenu *copyCoordinateMenu =
new QMenu( tr(
"Copy Coordinate" ), &menu );
1191 auto addCoordinateFormat = [&,
this](
const QString identifier,
const QgsCoordinateReferenceSystem &crs ) {
1192 const QgsCoordinateTransform ct( mSettings.destinationCrs(), crs, mSettings.transformContext() );
1195 const QgsPointXY transformedPoint = ct.transform( mapPoint );
1198 int displayPrecision = 0;
1201 QgsCoordinateTransform extentTransform = ct;
1206 displayPrecision = 0;
1208 displayPrecision = 1;
1210 displayPrecision = 2;
1212 displayPrecision = 3;
1214 displayPrecision = 4;
1216 displayPrecision = 5;
1218 displayPrecision = 6;
1220 displayPrecision = 7;
1222 displayPrecision = 8;
1224 displayPrecision = 9;
1226 catch ( QgsCsException & )
1231 const QList<Qgis::CrsAxisDirection> axisList = crs.axisOrdering();
1232 QString firstSuffix;
1233 QString secondSuffix;
1234 if ( axisList.size() >= 2 )
1240 QString firstNumber;
1241 QString secondNumber;
1244 firstNumber = QString::number( transformedPoint.
y(),
'f', displayPrecision );
1245 secondNumber = QString::number( transformedPoint.
x(),
'f', displayPrecision );
1249 firstNumber = QString::number( transformedPoint.
x(),
'f', displayPrecision );
1250 secondNumber = QString::number( transformedPoint.
y(),
'f', displayPrecision );
1253 QAction *copyCoordinateAction =
new QAction( QStringLiteral(
"%5 (%1%2, %3%4)" ).arg( firstNumber, firstSuffix, secondNumber, secondSuffix, identifier ), &menu );
1255 connect( copyCoordinateAction, &QAction::triggered,
this, [firstNumber, firstSuffix, secondNumber, secondSuffix, transformedPoint] {
1256 QClipboard *clipboard = QApplication::clipboard();
1258 const QString coordinates = QStringLiteral(
"%1%2, %3%4" ).arg( firstNumber, firstSuffix, secondNumber, secondSuffix );
1261 if ( clipboard->supportsSelection() )
1263 clipboard->setText( coordinates, QClipboard::Selection );
1265 clipboard->setText( coordinates, QClipboard::Clipboard );
1267 copyCoordinateMenu->addAction( copyCoordinateAction );
1269 catch ( QgsCsException & )
1275 QgsCoordinateReferenceSystem wgs84( QStringLiteral(
"EPSG:4326" ) );
1276 if ( mSettings.destinationCrs() != wgs84 )
1279 QgsSettings settings;
1280 const QString customCrsString = settings.
value( QStringLiteral(
"qgis/custom_coordinate_crs" ) ).toString();
1281 if ( !customCrsString.isEmpty() )
1283 QgsCoordinateReferenceSystem customCrs( customCrsString );
1284 if ( customCrs != mSettings.destinationCrs() && customCrs != QgsCoordinateReferenceSystem( QStringLiteral(
"EPSG:4326" ) ) )
1289 copyCoordinateMenu->addSeparator();
1290 QAction *setCustomCrsAction =
new QAction( tr(
"Set Custom CRS…" ), &menu );
1291 connect( setCustomCrsAction, &QAction::triggered,
this, [
this, customCrsString] {
1292 QgsProjectionSelectionDialog selector(
this );
1293 selector.setCrs( QgsCoordinateReferenceSystem( customCrsString ) );
1294 if ( selector.exec() )
1296 QgsSettings().setValue( QStringLiteral(
"qgis/custom_coordinate_crs" ), selector.crs().authid().isEmpty() ? selector.crs().toWkt(
Qgis::CrsWktVariant::Preferred ) : selector.crs().authid() );
1299 copyCoordinateMenu->addAction( setCustomCrsAction );
1301 menu.addMenu( copyCoordinateMenu );
1304 if ( !
mapTool()->populateContextMenuWithEvent( &menu,
event ) )
1305 mMapTool->populateContextMenu( &menu );
1309 if ( !menu.isEmpty() )
1310 menu.exec(
event->globalPos() );
1315 const QDateTime currentTime = QDateTime::currentDateTime();
1318 for (
const QgsMapRendererJob::Error &error : errors )
1320 const QString errorKey = error.layerID +
':' + error.message;
1321 if ( mRendererErrors.contains( errorKey ) )
1323 const QDateTime sameErrorTime = mRendererErrors.value( errorKey );
1325 if ( sameErrorTime.secsTo( currentTime ) < 60 )
1329 mRendererErrors[errorKey] = currentTime;
1336void QgsMapCanvas::updateDevicePixelFromScreen()
1338 mSettings.setDevicePixelRatio(
static_cast<float>( devicePixelRatioF() ) );
1342 if ( window()->windowHandle() )
1344 mSettings.setOutputDpi( window()->windowHandle()->screen()->physicalDotsPerInch() );
1345 mSettings.setDpiTarget( window()->windowHandle()->screen()->physicalDotsPerInch() );
1351 mSettings.setOutputDpi( window()->windowHandle()->screen()->logicalDotsPerInch() );
1352 mSettings.setDpiTarget( window()->windowHandle()->screen()->logicalDotsPerInch() );
1357void QgsMapCanvas::onElevationShadingRendererChanged()
1361 bool wasDeactivated = !mSettings.elevationShadingRenderer().isActive();
1362 mSettings.setElevationShadingRenderer( mProject->elevationShadingRenderer() );
1363 if ( mCache && wasDeactivated )
1373 mSettings.setTemporalRange( dateTimeRange );
1374 mSettings.setIsTemporal( dateTimeRange.
begin().isValid() || dateTimeRange.
end().isValid() );
1380 mCacheInvalidations |= CacheInvalidationType::Temporal;
1382 autoRefreshTriggered();
1387 return mSettings.temporalRange();
1392 mInteractionBlockers.append( blocker );
1397 mInteractionBlockers.removeAll( blocker );
1404 if ( block->blockCanvasInteraction( interaction ) )
1412 if ( mMapController )
1414 delete mMapController;
1415 mMapController =
nullptr;
1421 mMapController = controller;
1422 mMapController->setParent(
this );
1426 connect( mMapController, &QgsAbstract2DMapController::zoomMap,
this, [](
double factor ) {
zoomByFactor( factor ); } );
1430void QgsMapCanvas::mapUpdateTimeout()
1435 mMap->setContent( img, imageRect( img, mSettings ) );
1444 mJobCanceled =
true;
1447 mJob->cancelWithoutBlocking();
1465 image = theQPixmap->toImage();
1466 painter.begin( &image );
1476 image = mMap->contentImage().copy();
1477 painter.begin( &image );
1481 QStyleOptionGraphicsItem option;
1482 option.initFrom(
this );
1483 QGraphicsItem *item =
nullptr;
1484 QListIterator<QGraphicsItem *> i( items() );
1486 while ( i.hasPrevious() )
1488 item = i.previous();
1497 QPointF itemScenePos = item->scenePos();
1498 painter.translate( itemScenePos.x(), itemScenePos.y() );
1500 item->paint( &painter, &option );
1504 image.save( fileName, format.toLocal8Bit().data() );
1506 QFileInfo myInfo = QFileInfo( fileName );
1509 QString outputSuffix = myInfo.suffix();
1510 QString myWorldFileName = myInfo.absolutePath() +
'/' + myInfo.completeBaseName() +
'.'
1511 + outputSuffix.at( 0 ) + outputSuffix.at( myInfo.suffix().size() - 1 ) +
'w';
1512 QFile myWorldFile( myWorldFileName );
1513 if ( !myWorldFile.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
1517 QTextStream myStream( &myWorldFile );
1553 if ( ( r == current ) && magnified )
1558 if ( !mSettings.hasValidSettings() )
1566 QgsDebugMsgLevel( QStringLiteral(
"Empty extent - keeping old scale with new center!" ), 2 );
1575 if ( mScaleLocked && magnified )
1577 ScaleRestorer restorer(
this );
1582 mSettings.setMagnificationFactor( scaleFactor, &newCenter );
1587 mSettings.setExtent( r, magnified );
1594 for (
int i = mLastExtent.size() - 1; i > mLastExtentIndex; i-- )
1596 mLastExtent.removeAt( i );
1599 if ( !mLastExtent.isEmpty() && mLastExtent.last() != mSettings.extent() )
1601 mLastExtent.append( mSettings.extent() );
1605 if ( mLastExtent.size() > 100 )
1607 mLastExtent.removeAt( 0 );
1611 mLastExtentIndex = mLastExtent.size() - 1;
1660 return mCursorPoint;
1675 mSettings.setRotation( degrees );
1682 if ( !mBlockScaleChangedSignal )
1715 if ( mLastExtentIndex > 0 )
1718 mSettings.setExtent( mLastExtent[mLastExtentIndex] );
1731 if ( mLastExtentIndex < mLastExtent.size() - 1 )
1734 mSettings.setExtent( mLastExtent[mLastExtentIndex] );
1746 mLastExtent.clear();
1747 mLastExtent.append( mSettings.extent() );
1748 mLastExtentIndex = mLastExtent.size() - 1;
1766 double closestSquaredDistance = pow( extentRect.
width(), 2.0 ) + pow( extentRect.
height(), 2.0 );
1767 bool pointFound =
false;
1771 double sqrDist = point.
sqrDist( centerLayerCoordinates );
1772 if ( sqrDist > closestSquaredDistance || sqrDist < 4 * std::numeric_limits<double>::epsilon() )
1775 closestPoint = point;
1776 closestSquaredDistance = sqrDist;
1781 rect.combineExtentWith( mSettings.layerToMapCoordinates(
layer, closestPoint ) );
1782 rect.scale( scaleFactor, &
center );
1795 layer = mCurrentLayer;
1803 switch (
layer->type() )
1825 rect = optimalExtentForPointLayer( vlayer, rect.
center() );
1837 for (
const QgsFeature &feature : selectedFeatures )
1839 if ( !feature.hasGeometry() )
1878 if ( !mapLayer || !mapLayer->isSpatial() )
1881 switch ( mapLayer->type() )
1887 if (
layer->selectedFeatureCount() == 0 )
1890 rect =
layer->boundingBoxOfSelected();
1898 rect = optimalExtentForPointLayer(
layer, rect.
center() );
1912 for (
const QgsFeature &feature : selectedFeatures )
1914 if ( !feature.hasGeometry() )
1936 if ( selectionExtent.
isNull() )
1947 return mSettings.zRange();
1955 mSettings.setZRange( range );
1961 mCacheInvalidations |= CacheInvalidationType::Elevation;
1963 autoRefreshTriggered();
1999 if ( boundingBoxOfFeatureIds( ids,
layer, bbox, errorMsg ) )
2003 bbox = optimalExtentForPointLayer(
layer, bbox.
center() );
2022 if ( boundingBoxOfFeatureIds( ids,
layer, bbox, errorMsg ) )
2039 int featureCount = 0;
2047 errorMsg = tr(
"Feature does not have a geometry" );
2051 errorMsg = tr(
"Feature geometry is empty" );
2053 if ( !errorMsg.isEmpty() )
2062 if ( featureCount != ids.count() )
2064 errorMsg = tr(
"Feature not found" );
2076 layer = mCurrentLayer;
2082 switch (
layer->type() )
2100 for (
const QgsFeature &feature : selectedFeatures )
2102 if ( !feature.hasGeometry() )
2138 if ( !mapLayer || !mapLayer->isSpatial() )
2142 switch ( mapLayer->type() )
2147 if (
layer->selectedFeatureCount() == 0 )
2150 rect =
layer->boundingBoxOfSelected();
2158 rect = optimalExtentForPointLayer(
layer, rect.
center() );
2169 for (
const QgsFeature &feature : selectedFeatures )
2171 if ( !feature.hasGeometry() )
2194 if ( selectionExtent.
isNull() )
2211 QList<QgsGeometry> geoms;
2227 if ( geometries.isEmpty() )
2245 QColor startColor = color1;
2246 if ( !startColor.isValid() )
2256 startColor.setAlpha( 255 );
2258 QColor endColor = color2;
2259 if ( !endColor.isValid() )
2261 endColor = startColor;
2262 endColor.setAlpha( 0 );
2266 QVariantAnimation *animation =
new QVariantAnimation(
this );
2267 connect( animation, &QVariantAnimation::finished,
this, [animation, rb] {
2268 animation->deleteLater();
2271 connect( animation, &QPropertyAnimation::valueChanged,
this, [rb, geomType](
const QVariant &value ) {
2272 QColor
c = value.value<QColor>();
2281 c.setAlpha(
c.alpha() );
2287 animation->setDuration( duration * flashes );
2288 animation->setStartValue( endColor );
2289 double midStep = 0.2 / flashes;
2290 for (
int i = 0; i < flashes; ++i )
2292 double start =
static_cast<double>( i ) / flashes;
2293 animation->setKeyValueAt( start + midStep, startColor );
2294 double end =
static_cast<double>( i + 1 ) / flashes;
2296 animation->setKeyValueAt( end, endColor );
2298 animation->setEndValue( endColor );
2320 mMapTool->keyPressEvent( e );
2321 if ( !e->isAccepted() )
2326 double dx = std::fabs( currentExtent.
width() / 4 );
2327 double dy = std::fabs( currentExtent.
height() / 4 );
2359 if ( !e->isAutoRepeat() )
2361 mTemporaryCursorOverride = std::make_unique<QgsTemporaryCursorOverride>( Qt::ClosedHandCursor );
2367 case Qt::Key_PageUp:
2372 case Qt::Key_PageDown:
2379 mUseParallelRendering = !mUseParallelRendering;
2384 mDrawRenderingStats = !mDrawRenderingStats;
2412 mTemporaryCursorOverride.reset();
2422 mMapTool->keyReleaseEvent( e );
2427 QgsDebugMsgLevel(
"Ignoring key release: " + QString::number( e->key() ), 2 );
2440 auto me = std::make_unique<QgsMapMouseEvent>(
this, e );
2441 mMapTool->canvasDoubleClickEvent( me.get() );
2446void QgsMapCanvas::beginZoomRect( QPoint pos )
2448 mZoomRect.setRect( 0, 0, 0, 0 );
2449 mTemporaryCursorOverride = std::make_unique<QgsTemporaryCursorOverride>( mZoomCursor );
2450 mZoomDragging =
true;
2452 QColor color( Qt::blue );
2453 color.setAlpha( 63 );
2454 mZoomRubberBand->setColor( color );
2455 mZoomRect.setTopLeft( pos );
2458void QgsMapCanvas::stopZoomRect()
2460 if ( mZoomDragging )
2462 mZoomDragging =
false;
2463 mZoomRubberBand.reset(
nullptr );
2464 mTemporaryCursorOverride.reset();
2468void QgsMapCanvas::endZoomRect( QPoint pos )
2473 mZoomRect.setRight( pos.x() );
2474 mZoomRect.setBottom( pos.y() );
2477 mZoomRect = mZoomRect.normalized();
2479 if ( mZoomRect.width() < 5 && mZoomRect.height() < 5 )
2486 const QSize &zoomRectSize = mZoomRect.size();
2487 const QSize &canvasSize = mSettings.outputSize();
2488 double sfx =
static_cast<double>( zoomRectSize.width() ) / canvasSize.width();
2489 double sfy =
static_cast<double>( zoomRectSize.height() ) / canvasSize.height();
2490 double sf = std::max( sfx, sfy );
2492 QgsPointXY
c = mSettings.mapToPixel().toMapCoordinates( mZoomRect.center() );
2498void QgsMapCanvas::startPan()
2503 mTemporaryCursorOverride = std::make_unique<QgsTemporaryCursorOverride>( Qt::ClosedHandCursor );
2508void QgsMapCanvas::stopPan()
2513 mTemporaryCursorOverride.reset();
2521 if ( e->button() == Qt::MiddleButton && e->modifiers() & Qt::ShiftModifier )
2523 beginZoomRect( e->pos() );
2527 else if ( e->button() == Qt::MiddleButton )
2542 && e->modifiers() & Qt::ShiftModifier )
2544 beginZoomRect( e->pos() );
2549 auto me = std::make_unique<QgsMapMouseEvent>(
this, e );
2550 showContextMenu( me.get() );
2555 auto me = std::make_unique<QgsMapMouseEvent>(
this, e );
2556 mMapTool->canvasPressEvent( me.get() );
2573 if ( mZoomDragging && e->button() == Qt::MiddleButton )
2575 endZoomRect( e->pos() );
2579 else if ( e->button() == Qt::MiddleButton )
2583 else if ( e->button() == Qt::BackButton )
2588 else if ( e->button() == Qt::ForwardButton )
2595 if ( mZoomDragging && e->button() == Qt::LeftButton )
2597 endZoomRect( e->pos() );
2604 auto me = std::make_unique<QgsMapMouseEvent>(
this, e );
2605 mMapTool->canvasReleaseEvent( me.get() );
2618 QGraphicsView::resizeEvent( e );
2619 mResizeTimer->start( 500 );
2621 double oldScale = mSettings.scale();
2622 QSize lastSize = viewport()->size();
2623 mSettings.setOutputSize( lastSize );
2625 mScene->setSceneRect( QRectF( 0, 0, lastSize.width(), lastSize.height() ) );
2631 double scaleFactor = oldScale / mSettings.scale();
2635 mSettings.setExtent( r );
2649 QGraphicsView::paintEvent( e );
2654 if ( mBlockItemPositionUpdates )
2657 const QList<QGraphicsItem *> items = mScene->items();
2658 for ( QGraphicsItem *gi : items )
2675 QgsDebugMsgLevel(
"Wheel event delta " + QString::number( e->angleDelta().y() ), 2 );
2679 mMapTool->wheelEvent( e );
2680 if ( e->isAccepted() )
2684 if ( e->angleDelta().y() == 0 )
2691 bool reverseZoom = settings.
value( QStringLiteral(
"qgis/reverse_wheel_zoom" ),
false ).toBool();
2692 bool zoomIn = reverseZoom ? e->angleDelta().y() < 0 : e->angleDelta().y() > 0;
2696 zoomFactor = 1.0 + ( zoomFactor - 1.0 ) / 120.0 * std::fabs( e->angleDelta().y() );
2698 if ( e->modifiers() & Qt::ControlModifier )
2701 zoomFactor = 1.0 + ( zoomFactor - 1.0 ) / 20.0;
2704 double signedWheelFactor =
zoomIn ? 1 / zoomFactor : zoomFactor;
2709 QgsPointXY newCenter( mousePos.
x() + ( ( oldCenter.
x() - mousePos.
x() ) * signedWheelFactor ), mousePos.
y() + ( ( oldCenter.
y() - mousePos.
y() ) * signedWheelFactor ) );
2717 mWheelZoomFactor = std::max( factor, 1.01 );
2746 ScaleRestorer restorer(
this );
2757 if ( mScaleLocked != isLocked )
2759 mScaleLocked = isLocked;
2772 else if ( mZoomDragging )
2774 mZoomRect.setBottomRight( e->pos() );
2775 mZoomRubberBand->setToCanvasRectangle( mZoomRect );
2776 mZoomRubberBand->show();
2783 auto me = std::make_unique<QgsMapMouseEvent>(
this, e );
2784 mMapTool->canvasMoveEvent( me.get() );
2789 if ( !panOperationInProgress() )
2801 if ( tool == mMapTool )
2803 mMapTool->reactivate();
2812 disconnect( mMapTool, &QObject::destroyed,
this, &QgsMapCanvas::mapToolDestroyed );
2813 mMapTool->deactivate();
2823 connect( mMapTool, &QObject::destroyed,
this, &QgsMapCanvas::mapToolDestroyed );
2824 mMapTool->activate();
2831 if ( mMapTool && mMapTool == tool )
2833 disconnect( mMapTool, &QObject::destroyed,
this, &QgsMapCanvas::mapToolDestroyed );
2838 setCursor( Qt::ArrowCursor );
2859 mSettings.setBackgroundColor( color );
2862 QBrush bgBrush( color );
2863 setBackgroundBrush( bgBrush );
2866 palette.setColor( backgroundRole(), color );
2867 setPalette( palette );
2871 mScene->setBackgroundBrush( bgBrush );
2880 return mScene->backgroundBrush().color();
2885 if ( mSettings.selectionColor() == color )
2888 mSettings.setSelectionColor( color );
2892 bool hasSelectedFeatures =
false;
2893 const auto layers = mSettings.layers();
2899 hasSelectedFeatures =
true;
2904 if ( hasSelectedFeatures )
2914 return mSettings.selectionColor();
2955 return mSettings.layerStyleOverrides();
2960 if ( overrides == mSettings.layerStyleOverrides() )
2963 mSettings.setLayerStyleOverrides( overrides );
2970 if ( mTheme ==
theme )
2977 mSettings.setLayerStyleOverrides( QMap<QString, QString>() );
2984 setLayersPrivate(
QgsProject::instance()->mapThemeCollection()->mapThemeVisibleLayers( mTheme ) );
3002void QgsMapCanvas::connectNotify(
const char *signal )
3009void QgsMapCanvas::layerRepaintRequested(
bool deferred )
3015void QgsMapCanvas::autoRefreshTriggered()
3021 mRefreshAfterJob =
true;
3028void QgsMapCanvas::updateAutoRefreshTimer()
3032 int minAutoRefreshInterval = -1;
3033 const auto layers = mSettings.layers();
3036 int layerRefreshInterval = 0;
3038 if (
layer->hasAutoRefreshEnabled() &&
layer->autoRefreshInterval() > 0 )
3040 layerRefreshInterval =
layer->autoRefreshInterval();
3042 else if ( QgsVectorLayer *vectorLayer = qobject_cast<QgsVectorLayer *>(
layer ) )
3044 if (
const QgsFeatureRenderer *renderer = vectorLayer->renderer() )
3047 if ( rendererRefreshRate > 0 )
3049 layerRefreshInterval = 1000 / rendererRefreshRate;
3054 if ( layerRefreshInterval == 0 )
3057 minAutoRefreshInterval = minAutoRefreshInterval > 0 ? std::min( layerRefreshInterval, minAutoRefreshInterval ) : layerRefreshInterval;
3060 if ( minAutoRefreshInterval > 0 )
3062 mAutoRefreshTimer.setInterval( minAutoRefreshInterval );
3063 mAutoRefreshTimer.start();
3067 mAutoRefreshTimer.stop();
3071void QgsMapCanvas::projectThemesChanged()
3073 if ( mTheme.isEmpty() )
3103 double dx = end.
x() - start.
x();
3104 double dy = end.
y() - start.
y();
3106 c.set(
c.x() - dx,
c.y() - dy );
3129 emit
panDistanceBearingChanged( mDa.measureLine( currentMapPoint, startMapPoint ), mDa.lengthUnits(), mDa.bearing( currentMapPoint, startMapPoint ) * 180 / M_PI );
3144 setSceneRect( -pnt.x(), -pnt.y(), viewport()->size().width(), viewport()->size().height() );
3152 bool allHandled =
true;
3155 bool handled =
false;
3158 if ( handler && handler->customUriProviderKey() == uri.providerKey )
3160 if ( handler->handleCustomUriCanvasDrop( uri,
this ) )
3184 updateDevicePixelFromScreen();
3189 if ( !mBlockExtentChangedSignal )
3200 if ( !mPreviewEffect )
3205 mPreviewEffect->setEnabled( previewEnabled );
3210 if ( !mPreviewEffect )
3215 return mPreviewEffect->isEnabled();
3220 if ( !mPreviewEffect )
3225 mPreviewEffect->setMode( mode );
3230 if ( !mPreviewEffect )
3235 return mPreviewEffect->mode();
3240 if ( !mSnappingUtils )
3246 return mSnappingUtils;
3251 mSnappingUtils = utils;
3258 QDomNodeList nodes = doc.elementsByTagName( QStringLiteral(
"mapcanvas" ) );
3259 if ( nodes.count() )
3261 QDomNode node = nodes.item( 0 );
3264 if ( nodes.count() > 1 )
3266 for (
int i = 0; i < nodes.size(); ++i )
3268 QDomElement elementNode = nodes.at( i ).toElement();
3270 if ( elementNode.hasAttribute( QStringLiteral(
"name" ) ) && elementNode.attribute( QStringLiteral(
"name" ) ) == objectName() )
3272 node = nodes.at( i );
3280 if ( objectName() != QLatin1String(
"theMapCanvas" ) )
3285 if (
QgsProject::instance()->viewSettings()->restoreProjectExtentOnProjectLoad() && objectName() == QLatin1String(
"theMapCanvas" ) )
3298 QDomElement elem = node.toElement();
3299 if ( elem.hasAttribute( QStringLiteral(
"theme" ) ) )
3301 if (
QgsProject::instance()->mapThemeCollection()->hasMapTheme( elem.attribute( QStringLiteral(
"theme" ) ) ) )
3303 setTheme( elem.attribute( QStringLiteral(
"theme" ) ) );
3306 setAnnotationsVisible( elem.attribute( QStringLiteral(
"annotationsVisible" ), QStringLiteral(
"1" ) ).toInt() );
3309 const QDomNodeList scopeElements = elem.elementsByTagName( QStringLiteral(
"expressionContextScope" ) );
3310 if ( scopeElements.size() > 0 )
3312 const QDomElement scopeElement = scopeElements.at( 0 ).toElement();
3318 QgsDebugMsgLevel( QStringLiteral(
"Couldn't read mapcanvas information from project" ), 2 );
3319 if ( !
project->viewSettings()->defaultViewExtent().isNull() )
3333 QDomNodeList nl = doc.elementsByTagName( QStringLiteral(
"qgis" ) );
3336 QgsDebugError( QStringLiteral(
"Unable to find qgis element in project file" ) );
3339 QDomNode qgisNode = nl.item( 0 );
3341 QDomElement mapcanvasNode = doc.createElement( QStringLiteral(
"mapcanvas" ) );
3342 mapcanvasNode.setAttribute( QStringLiteral(
"name" ), objectName() );
3343 if ( !mTheme.isEmpty() )
3344 mapcanvasNode.setAttribute( QStringLiteral(
"theme" ), mTheme );
3345 mapcanvasNode.setAttribute( QStringLiteral(
"annotationsVisible" ), mAnnotationsVisible );
3346 qgisNode.appendChild( mapcanvasNode );
3348 mSettings.writeXml( mapcanvasNode, doc );
3351 QDomElement scopeElement = doc.createElement( QStringLiteral(
"expressionContextScope" ) );
3353 tmpScope.
removeVariable( QStringLiteral(
"atlas_featurenumber" ) );
3359 mapcanvasNode.appendChild( scopeElement );
3366 if ( mScaleLocked && !ignoreScaleLock )
3368 ScaleRestorer restorer(
this );
3403 bool allHandled =
true;
3406 bool handled =
false;
3409 if ( handler->canHandleCustomUriCanvasDrop( uri,
this ) )
3431 if (
event->type() == QEvent::ToolTip && mMapTool && mMapTool->canvasToolTipEvent( qgis::down_cast<QHelpEvent *>(
event ) ) )
3435 return QGraphicsView::viewportEvent(
event );
3438void QgsMapCanvas::mapToolDestroyed()
3446 if ( e->type() == QEvent::Gesture )
3448 if ( QTapAndHoldGesture *tapAndHoldGesture = qobject_cast<QTapAndHoldGesture *>(
static_cast<QGestureEvent *
>( e )->gesture( Qt::TapAndHoldGesture ) ) )
3450 QPointF pos = tapAndHoldGesture->position();
3451 pos = mapFromGlobal( QPoint( pos.x(), pos.y() ) );
3459 return mMapTool->gestureEvent(
static_cast<QGestureEvent *
>( e ) );
3464 return QGraphicsView::event( e );
3490 while ( mRefreshScheduled || mJob )
3492 QgsApplication::processEvents();
3498 mSettings.setSegmentationTolerance( tolerance );
3503 mSettings.setSegmentationToleranceType( type );
3508 QList<QgsMapCanvasAnnotationItem *> annotationItemList;
3509 const QList<QGraphicsItem *> items = mScene->items();
3510 for ( QGraphicsItem *gi : items )
3515 annotationItemList.push_back( aItem );
3519 return annotationItemList;
3524 mAnnotationsVisible = show;
3528 item->setVisible( show );
3534 mSettings.setLabelingEngineSettings( settings );
3539 return mSettings.labelingEngineSettings();
3542void QgsMapCanvas::startPreviewJobs()
3545 schedulePreviewJob( 0 );
3548void QgsMapCanvas::startPreviewJob(
int number )
3558 const QgsRectangle mapRect =
mapSettings.visibleExtent();
3559 QgsPointXY jobCenter = mapRect.
center();
3560 const double dx = ( i - 1 ) * mapRect.
width();
3561 const double dy = ( 1 - j ) * mapRect.
height();
3564 const double radians = mSettings.rotation() * M_PI / 180;
3565 const double rdx = dx * cos( radians ) - dy * sin( radians );
3566 const double rdy = dy * cos( radians ) + dx * sin( radians );
3567 jobCenter.
setX( jobCenter.
x() + rdx );
3568 jobCenter.
setY( jobCenter.
y() + rdy );
3572 jobCenter.
setX( jobCenter.
x() + dx );
3573 jobCenter.
setY( jobCenter.
y() + dy );
3578 QgsMapSettings jobSettings = mSettings;
3586 const QList<QgsMapLayer *>
layers = jobSettings.
layers();
3587 QList<QgsMapLayer *> previewLayers;
3588 QgsDataProvider::PreviewContext context;
3592 if (
layer->customProperty( QStringLiteral(
"rendering/noPreviewJobs" ),
false ).toBool() )
3594 QgsDebugMsgLevel( QStringLiteral(
"Layer %1 not rendered because it is explicitly blocked from preview jobs" ).arg(
layer->id() ), 3 );
3598 QgsDataProvider *provider =
layer->dataProvider();
3601 QgsDebugMsgLevel( QStringLiteral(
"Layer %1 not rendered because it does not match the renderInPreview criterion %2" ).arg(
layer->id() ).arg( mLastLayerRenderTime.value(
layer->id() ) ), 3 );
3605 previewLayers <<
layer;
3614 QgsMapRendererQImageJob *job =
new QgsMapRendererSequentialJob( jobSettings );
3615 job->setProperty(
"number", number );
3616 mPreviewJobs.append( job );
3621void QgsMapCanvas::stopPreviewJobs()
3623 mPreviewTimer.stop();
3624 for (
auto previewJob = mPreviewJobs.constBegin(); previewJob != mPreviewJobs.constEnd(); ++previewJob )
3630 ( *previewJob )->cancelWithoutBlocking();
3633 mPreviewJobs.clear();
3636void QgsMapCanvas::schedulePreviewJob(
int number )
3638 mPreviewTimer.setSingleShot(
true );
3640 disconnect( mPreviewTimerConnection );
3641 mPreviewTimerConnection = connect( &mPreviewTimer, &QTimer::timeout,
this, [
this, number]() {
3642 startPreviewJob( number );
3644 mPreviewTimer.start();
3647bool QgsMapCanvas::panOperationInProgress()
3652 if ( QgsMapToolPan *panTool = qobject_cast<QgsMapToolPan *>( mMapTool ) )
3654 if ( panTool->isDragging() )
3661int QgsMapCanvas::nextZoomLevel(
const QList<double> &resolutions,
bool zoomIn )
const
3663 int resolutionLevel = -1;
3665 int nResolutions = resolutions.size();
3667 for (
int i = 0; i < nResolutions; ++i )
3669 if (
qgsDoubleNear( resolutions[i], currentResolution, 0.0001 ) )
3671 resolutionLevel =
zoomIn ? ( i - 1 ) : ( i + 1 );
3674 else if ( currentResolution <= resolutions[i] )
3676 resolutionLevel =
zoomIn ? ( i - 1 ) : i;
3679 resolutionLevel =
zoomIn ? i : i + 1;
3682 if ( resolutionLevel < 0 || resolutionLevel >= nResolutions )
3686 if (
zoomIn && resolutionLevel == nResolutions - 1 && resolutions[nResolutions - 1] < currentResolution / mWheelZoomFactor )
3691 if ( !
zoomIn && resolutionLevel == 0 && resolutions[0] > mWheelZoomFactor * currentResolution )
3696 return resolutionLevel;
3701 if ( !mZoomResolutions.isEmpty() )
3703 int zoomLevel = nextZoomLevel( mZoomResolutions,
true );
3704 if ( zoomLevel != -1 )
3709 return 1 / mWheelZoomFactor;
3714 if ( !mZoomResolutions.isEmpty() )
3716 int zoomLevel = nextZoomLevel( mZoomResolutions,
false );
3717 if ( zoomLevel != -1 )
3722 return mWheelZoomFactor;
static const int PREVIEW_JOB_DELAY_MS
Delay between the scheduling of 2 preview jobs.
QFlags< MapSettingsFlag > MapSettingsFlags
Map settings flags.
@ MediumString
A medium-length string, recommended for general purpose use.
DistanceUnit
Units of distance.
@ Degrees
Degrees, for planar geographic CRS distance measurements.
@ ShowMainAnnotationLayer
The project's main annotation layer should be rendered in the canvas.
static const int MAXIMUM_LAYER_PREVIEW_TIME_MS
Maximum rendering time for a layer of a preview job.
@ Animated
Temporal navigation relies on frames within a datetime range.
@ Movie
Movie mode – behaves like a video player, with a fixed frame duration and no temporal range.
@ FixedRange
Temporal navigation relies on a fixed datetime range.
@ Disabled
Temporal navigation is disabled.
@ Warning
Warning message.
@ AffectsLabeling
If present, indicates that the renderer will participate in the map labeling problem.
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
@ Group
Composite group layer. Added in QGIS 3.24.
@ Plugin
Plugin based layer.
@ TiledScene
Tiled scene layer. Added in QGIS 3.34.
@ Annotation
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
@ VectorTile
Vector tile layer. Added in QGIS 3.14.
@ Mesh
Mesh layer. Added in QGIS 3.2.
@ PointCloud
Point cloud layer. Added in QGIS 3.18.
@ YX
Northing/Easting (or Latitude/Longitude for geographic CRS).
@ View
Renderer used for displaying on screen.
QFlags< MapCanvasFlag > MapCanvasFlags
Flags controlling behavior of map canvases.
@ Preferred
Preferred format, matching the most recent WKT ISO standard. Currently an alias to WKT2_2019,...
@ BallparkTransformsAreAppropriate
Indicates that approximate "ballpark" results are appropriate for this coordinate transform....
@ IgnoreImpossibleTransformations
Indicates that impossible transformations (such as those which attempt to transform between two diffe...
@ DrawEditingInfo
Enable drawing of vertex markers for layers in editing mode.
@ RenderPreviewJob
Render is a 'canvas preview' render, and shortcuts should be taken to ensure fast rendering.
@ RenderMapTile
Draw map such that there are no problems between adjacent tiles.
@ RecordProfile
Enable run-time profiling while rendering.
@ UseRenderingOptimization
Enable vector simplification and other rendering optimizations.
@ RenderPartialOutput
Whether to make extra effort to update map image with partially rendered layers (better for interacti...
@ Antialiasing
Enable anti-aliasing for map rendering.
@ DrawLabeling
Enable drawing of labels on top of the map.
@ HighQualityImageTransforms
Enable high quality image transformations, which results in better appearance of scaled or rotated ra...
Abstract base class for all 2D map controllers.
SegmentationToleranceType
Segmentation tolerance as maximum angle or maximum difference between approximation and circle.
@ MaximumAngle
Maximum angle between generating radii (lines from arc center to output vertices).
virtual bool isEmpty() const
Returns true if the geometry is empty.
Represents a map layer containing a set of georeferenced annotations, e.g.
static QCursor getThemeCursor(Cursor cursor)
Helper to get a theme cursor.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
static QgsImageCache * imageCache()
Returns the application's image cache, used for caching resampled versions of raster images.
static QgsRuntimeProfiler * profiler()
Returns the application runtime profiler.
static QgsSvgCache * svgCache()
Returns the application's SVG cache, used for caching SVG images and handling parameter replacement w...
static QgsCoordinateReferenceSystemRegistry * coordinateReferenceSystemRegistry()
Returns the application's coordinate reference system (CRS) registry, which handles known CRS definit...
void userCrsChanged(const QString &id)
Emitted whenever an existing user CRS definition is changed.
static Qgis::CoordinateOrder defaultCoordinateOrderForCrs(const QgsCoordinateReferenceSystem &crs)
Returns the default coordinate order to use for the specified crs.
static QString axisDirectionToAbbreviatedString(Qgis::CrsAxisDirection axis)
Returns a translated abbreviation representing an axis direction.
Represents a coordinate reference system (CRS).
void updateDefinition()
Updates the definition and parameters of the coordinate reference system to their latest values.
Custom exception class for Coordinate Reference System related exceptions.
Abstract base class that may be implemented to handle new types of data to be dropped in QGIS.
virtual bool renderInPreview(const QgsDataProvider::PreviewContext &context)
Returns whether the layer must be rendered in preview jobs.
A general purpose distance and area calculator, capable of performing ellipsoid based calculations.
QgsRange which stores a range of double values.
Abstract interface for generating an expression context scope.
Single scope for storing variables and functions for use within a QgsExpressionContext.
bool writeXml(QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context) const
Writes scope variables to an XML element.
bool removeVariable(const QString &name)
Removes a variable from the context scope, if found.
void setVariable(const QString &name, const QVariant &value, bool isStatic=false)
Convenience method for setting a variable in the context scope by name name and value.
static QgsExpressionContextScope * projectScope(const QgsProject *project)
Creates a new scope which contains variables and functions relating to a QGIS project.
static QgsExpressionContextScope * atlasScope(const QgsLayoutAtlas *atlas)
Creates a new scope which contains variables and functions relating to a QgsLayoutAtlas.
static QgsExpressionContextScope * mapSettingsScope(const QgsMapSettings &mapSettings)
Creates a new scope which contains variables and functions relating to a QgsMapSettings object.
static QgsExpressionContextScope * globalScope()
Creates a new scope which contains variables and functions relating to the global QGIS context.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
Wraps a request for features to a vector layer (or directly its vector data provider).
QgsFeatureRequest & setLimit(long long limit)
Set the maximum number of features to request.
QgsFeatureRequest & setNoAttributes()
Set that no attributes will be fetched.
QgsFeatureRequest & setFilterRect(const QgsRectangle &rectangle)
Sets the rectangle from which features will be taken.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
bool hasGeometry() const
Returns true if the feature has an associated geometry.
A geometry is the spatial representation of a feature.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
QgsPointXY asPoint() const
Returns the contents of the geometry as a 2-dimensional point.
static QgsGeometry fromPointXY(const QgsPointXY &point)
Creates a new geometry from a QgsPointXY object.
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
void remoteImageFetched(const QString &url)
Emitted when the cache has finished retrieving an image file from a remote url.
Stores global configuration for labeling engine.
Stores computed placement from labeling engine.
static void warning(const QString &msg)
Goes to qWarning.
An interactive map canvas item which displays a QgsAnnotation.
An interface for objects which block interactions with a QgsMapCanvas.
Interaction
Available interactions to block.
An abstract class for items that can be placed on the map canvas.
virtual void updatePosition()
called on changed extent or resize event to update position of the item
Snapping utils instance that is connected to a canvas and updates the configuration (map settings + c...
Deprecated to be deleted, stuff from here should be moved elsewhere.
QPoint mouseLastXY
Last seen point of the mouse.
bool panSelectorDown
Flag to indicate the pan selector key is held down by user.
CanvasProperties()=default
Constructor for CanvasProperties.
QPoint rubberStartPoint
Beginning point of a rubber band.
bool mouseButtonDown
Flag to indicate status of mouse button.
void setCurrentLayer(QgsMapLayer *layer)
void contextMenuAboutToShow(QMenu *menu, QgsMapMouseEvent *event)
Emitted before the map canvas context menu will be shown.
void zoomToProjectExtent()
Zoom to the full extent the project associated with this canvas.
void panToSelected(QgsMapLayer *layer=nullptr)
Pan to the selected features of current ayer keeping same extent.
void freeze(bool frozen=true)
Freezes/thaws the map canvas.
void enableAntiAliasing(bool flag)
used to determine if anti-aliasing is enabled or not
void zoomToSelected(QgsMapLayer *layer=nullptr)
Zoom to the extent of the selected features of provided map layer.
void setSnappingUtils(QgsSnappingUtils *utils)
Assign an instance of snapping utils to the map canvas.
bool isCachingEnabled() const
Check whether images of rendered layers are curerently being cached.
void zoomToFullExtent()
Zoom to the full extent of all layers currently visible in the canvas.
void setLayers(const QList< QgsMapLayer * > &layers)
Sets the list of layers that should be shown in the canvas.
void setProject(QgsProject *project)
Sets the project linked to this canvas.
const QgsRenderedItemResults * renderedItemResults(bool allowOutdatedResults=true) const
Gets access to the rendered item results (may be nullptr), which includes the results of rendering an...
void setMapController(QgsAbstract2DMapController *controller)
Sets the input controller device to use for controlling the canvas.
QColor selectionColor() const
Returns color for selected features.
bool event(QEvent *e) override
void setCachingEnabled(bool enabled)
Set whether to cache images of rendered layers.
void mouseReleaseEvent(QMouseEvent *e) override
QgsDoubleRange zRange() const
Returns the range of z-values which will be visible in the map.
void setExtent(const QgsRectangle &r, bool magnified=false)
Sets the extent of the map canvas to the specified rectangle.
void setRenderFlag(bool flag)
Sets whether a user has disabled canvas renders via the GUI.
void selectionChanged(QgsMapLayer *layer)
Emitted when selection in any layer gets changed.
QList< QgsMapCanvasAnnotationItem * > annotationItems() const
Returns a list of all annotation items in the canvas.
void updateCanvasItemPositions()
called on resize or changed extent to notify canvas items to change their rectangle
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
void extentsChanged()
Emitted when the extents of the map change.
QgsExpressionContextScope * defaultExpressionContextScope() const
Creates a new scope which contains default variables and functions relating to the map canvas.
void xyCoordinates(const QgsPointXY &p)
Emits current mouse position.
void setFlags(Qgis::MapCanvasFlags flags)
Sets flags which control how the map canvas behaves.
void stopRendering()
stop rendering (if there is any right now)
void setLabelingEngineSettings(const QgsLabelingEngineSettings &settings)
Sets global labeling engine settings in the internal map settings.
QgsPointXY center() const
Gets map center, in geographical coordinates.
void showEvent(QShowEvent *event) override
int layerCount() const
Returns number of layers on the map.
void emitExtentsChanged()
Emits the extentsChanged signal when appropriate.
bool antiAliasingEnabled() const
true if antialiasing is enabled
void setPreviewMode(QgsPreviewEffect::PreviewMode mode)
Sets a preview mode for the map canvas.
QVector< T > layers() const
Returns a list of registered map layers with a specified layer type.
void layerStateChange()
This slot is connected to the visibility change of one or more layers.
QgsPreviewEffect::PreviewMode previewMode() const
Returns the current preview mode for the map canvas.
void zoomScale(double scale, bool ignoreScaleLock=false)
Zooms the canvas to a specific scale.
void zoomWithCenter(int x, int y, bool zoomIn)
Zooms in/out with a given center.
QPoint mouseLastXY()
returns last position of mouse cursor
void clearCache()
Make sure to remove any rendered images from cache (does nothing if cache is not enabled).
void tapAndHoldGestureOccurred(const QgsPointXY &mapPoint, QTapAndHoldGesture *gesture)
Emitted whenever a tap and hold gesture occurs at the specified map point.
const QgsDateTimeRange & temporalRange() const
Returns map canvas datetime range.
void setCanvasColor(const QColor &_newVal)
Write property of QColor bgColor.
void panDistanceBearingChanged(double distance, Qgis::DistanceUnit unit, double bearing)
Emitted whenever the distance or bearing of an in-progress panning operation is changed.
void zoomByFactor(double scaleFactor, const QgsPointXY *center=nullptr, bool ignoreScaleLock=false)
Zoom with the factor supplied.
const QgsTemporalController * temporalController() const
Gets access to the temporal controller that will be used to update the canvas temporal range.
void flashGeometries(const QList< QgsGeometry > &geometries, const QgsCoordinateReferenceSystem &crs=QgsCoordinateReferenceSystem(), const QColor &startColor=QColor(255, 0, 0, 255), const QColor &endColor=QColor(255, 0, 0, 0), int flashes=3, int duration=500)
Causes a set of geometries to flash within the canvas.
void setMapUpdateInterval(int timeMilliseconds)
Set how often map preview should be updated while it is being rendered (in milliseconds).
bool setReferencedExtent(const QgsReferencedRectangle &extent)
Sets the canvas to the specified extent.
void dragEnterEvent(QDragEnterEvent *e) override
QgsMapRendererCache * cache()
Returns the map renderer cache, if caching is enabled.
bool isDrawing()
Find out whether rendering is in progress.
void zRangeChanged()
Emitted when the map canvas z (elevation) range changes.
void keyPressEvent(QKeyEvent *e) override
void setZRange(const QgsDoubleRange &range)
Sets the range of z-values which will be visible in the map.
void clearExtentHistory()
Clears the list of extents and sets current extent as first item.
void zoomToPreviousExtent()
Zoom to the previous extent (view).
void enableMapTileRendering(bool flag)
sets map tile rendering flag
void panAction(QMouseEvent *event)
Called when mouse is moving and pan is activated.
void setLayerStyleOverrides(const QMap< QString, QString > &overrides)
Sets the stored overrides of styles for rendering layers.
QList< QgsMapLayer * > layers(bool expandGroupLayers=false) const
Returns the list of layers shown within the map canvas.
const QgsLabelingEngineSettings & labelingEngineSettings() const
Returns global labeling engine settings from the internal map settings.
void scaleChanged(double scale)
Emitted when the scale of the map changes.
void mapToolSet(QgsMapTool *newTool, QgsMapTool *oldTool)
Emit map tool changed with the old tool.
void canvasColorChanged()
Emitted when canvas background color changes.
double zoomInFactor() const
Returns the zoom in factor.
void saveAsImage(const QString &fileName, QPixmap *QPixmap=nullptr, const QString &="PNG")
Save the contents of the map canvas to disk as an image.
void setSegmentationToleranceType(QgsAbstractGeometry::SegmentationToleranceType type)
Sets segmentation tolerance type (maximum angle or maximum difference between curve and approximation...
void setTemporalRange(const QgsDateTimeRange &range)
Set datetime range for the map canvas.
void moveCanvasContents(bool reset=false)
called when panning is in action, reset indicates end of panning
void magnificationChanged(double magnification)
Emitted when the scale of the map changes.
void zoomOut()
Zoom out with fixed factor.
void currentLayerChanged(QgsMapLayer *layer)
Emitted when the current layer is changed.
void setTemporalController(QgsTemporalController *controller)
Sets the temporal controller for this canvas.
void renderErrorOccurred(const QString &error, QgsMapLayer *layer)
Emitted whenever an error is encountered during a map render operation.
void addOverlayWidget(QWidget *widget, Qt::Edge edge)
Adds an overlay widget to the layout, which will be bound to the specified edge.
void waitWhileRendering()
Blocks until the rendering job has finished.
void mapRefreshCanceled()
Emitted when the pending map refresh has been canceled.
double magnificationFactor() const
Returns the magnification factor.
void writeProject(QDomDocument &)
called to write map canvas settings to project
void mousePressEvent(QMouseEvent *e) override
void updateScale()
Emits signal scaleChanged to update scale in main window.
void setMagnificationFactor(double factor, const QgsPointXY *center=nullptr)
Sets the factor of magnification to apply to the map canvas.
void refreshAllLayers()
Reload all layers (including refreshing layer properties from their data sources),...
void unsetMapTool(QgsMapTool *mapTool)
Unset the current map tool or last non zoom tool.
void panActionEnd(QPoint releasePoint)
Ends pan action and redraws the canvas.
void resizeEvent(QResizeEvent *e) override
double zoomOutFactor() const
Returns the zoom in factor.
void renderStarting()
Emitted when the canvas is about to be rendered.
void setMapSettingsFlags(Qgis::MapSettingsFlags flags)
Resets the flags for the canvas' map settings.
std::unique_ptr< CanvasProperties > mCanvasProperties
Handle pattern for implementation object.
void keyReleased(QKeyEvent *e)
Emit key release event.
QgsMapTool * mapTool() const
Returns the currently active tool.
void setWheelFactor(double factor)
Sets wheel zoom factor (should be greater than 1).
void setAnnotationsVisible(bool visible)
Sets whether annotations are visible in the canvas.
void layerStyleOverridesChanged()
Emitted when the configuration of overridden layer styles changes.
QgsMapCanvas(QWidget *parent=nullptr)
Constructor.
void panActionStart(QPoint releasePoint)
Starts a pan action.
void zoomNextStatusChanged(bool available)
Emitted when zoom next status changed.
void setPreviewJobsEnabled(bool enabled)
Sets whether canvas map preview jobs (low priority render jobs which render portions of the view just...
QgsRectangle fullExtent() const
Returns the combined extent for all layers on the map canvas.
void redrawAllLayers()
Clears all cached images and redraws all layers.
void keyReleaseEvent(QKeyEvent *e) override
bool isFrozen() const
Returns true if canvas is frozen.
void rotationChanged(double rotation)
Emitted when the rotation of the map changes.
void panToFeatureIds(QgsVectorLayer *layer, const QgsFeatureIds &ids, bool alwaysRecenter=true)
Centers canvas extent to feature ids.
void messageEmitted(const QString &title, const QString &message, Qgis::MessageLevel level=Qgis::MessageLevel::Info)
emit a message (usually to be displayed in a message bar)
void scaleLockChanged(bool locked)
Emitted when the scale locked state of the map changes.
const QgsLabelingResults * labelingResults(bool allowOutdatedResults=true) const
Gets access to the labeling results (may be nullptr).
void mouseMoveEvent(QMouseEvent *e) override
QgsRectangle projectExtent() const
Returns the associated project's full extent, in the canvas' CRS.
void setCenter(const QgsPointXY ¢er)
Set the center of the map canvas, in geographical coordinates.
void setParallelRenderingEnabled(bool enabled)
Set whether the layers are rendered in parallel or sequentially.
void setDestinationCrs(const QgsCoordinateReferenceSystem &crs)
Sets destination coordinate reference system.
void flashFeatureIds(QgsVectorLayer *layer, const QgsFeatureIds &ids, const QColor &startColor=QColor(255, 0, 0, 255), const QColor &endColor=QColor(255, 0, 0, 0), int flashes=3, int duration=500)
Causes a set of features with matching ids from a vector layer to flash within the canvas.
void installInteractionBlocker(QgsMapCanvasInteractionBlocker *blocker)
Installs an interaction blocker onto the canvas, which may prevent certain map canvas interactions fr...
bool isParallelRenderingEnabled() const
Check whether the layers are rendered in parallel or sequentially.
double scale() const
Returns the last reported scale of the canvas.
QgsSnappingUtils * snappingUtils() const
Returns snapping utility class that is associated with map canvas.
Qgis::DistanceUnit mapUnits() const
Convenience function for returning the current canvas map units.
double rotation() const
Gets the current map canvas rotation in clockwise degrees.
void temporalRangeChanged()
Emitted when the map canvas temporal range changes.
void paintEvent(QPaintEvent *e) override
void zoomLastStatusChanged(bool available)
Emitted when zoom last status changed.
void setSegmentationTolerance(double tolerance)
Sets the segmentation tolerance applied when rendering curved geometries.
void themeChanged(const QString &theme)
Emitted when the canvas has been assigned a different map theme.
void destinationCrsChanged()
Emitted when map CRS has changed.
void transformContextChanged()
Emitted when the canvas transform context is changed.
void keyPressed(QKeyEvent *e)
Emit key press event.
void setMapTool(QgsMapTool *mapTool, bool clean=false)
Sets the map tool currently being used on the canvas.
QColor canvasColor() const
Read property of QColor bgColor.
void mapCanvasRefreshed()
Emitted when canvas finished a refresh request.
int mapUpdateInterval() const
Find out how often map preview should be updated while it is being rendered (in milliseconds).
void setSelectionColor(const QColor &color)
Set color of selected vector features.
double mapUnitsPerPixel() const
Returns the mapUnitsPerPixel (map units per pixel) for the canvas.
void mouseDoubleClickEvent(QMouseEvent *e) override
void selectionChangedSlot()
Receives signal about selection change, and pass it on with layer info.
bool viewportEvent(QEvent *event) override
void setCustomDropHandlers(const QVector< QPointer< QgsCustomDropHandler > > &handlers)
Sets a list of custom drop handlers to use when drop events occur on the canvas.
void zoomToNextExtent()
Zoom to the next extent (view).
void layersChanged()
Emitted when a new set of layers has been received.
void zoomToFeatureIds(QgsVectorLayer *layer, const QgsFeatureIds &ids)
Set canvas extent to the bounding box of a set of features.
void renderComplete(QPainter *painter)
Emitted when the canvas has rendered.
void zoomIn()
Zoom in with fixed factor.
QgsMapLayer * layer(int index)
Returns the map layer at position index in the layer stack.
void cancelJobs()
Cancel any rendering job, in a blocking way.
Qgis::MapCanvasFlags flags() const
Returns flags which control how the map canvas behaves.
bool allowInteraction(QgsMapCanvasInteractionBlocker::Interaction interaction) const
Returns true if the specified interaction is currently permitted on the canvas.
void wheelEvent(QWheelEvent *e) override
bool previewModeEnabled() const
Returns whether a preview mode is enabled for the map canvas.
const QgsMapToPixel * getCoordinateTransform()
Gets the current coordinate transform.
void dropEvent(QDropEvent *event) override
void setPreviewModeEnabled(bool previewEnabled)
Enables a preview mode for the map canvas.
QgsProject * project()
Returns the project linked to this canvas.
void setScaleLocked(bool isLocked)
Lock the scale, so zooming can be performed using magnication.
void setRotation(double degrees)
Set the rotation of the map canvas in clockwise degrees.
void removeInteractionBlocker(QgsMapCanvasInteractionBlocker *blocker)
Removes an interaction blocker from the canvas.
void readProject(const QDomDocument &)
called to read map canvas settings from project
void setTheme(const QString &theme)
Sets a map theme to show in the canvas.
void zoomToFeatureExtent(QgsRectangle &rect)
Zooms to feature extent.
QMap< QString, QString > layerStyleOverrides() const
Returns the stored overrides of styles for layers.
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
QgsRectangle extent() const
Returns the current zoom extent of the map canvas.
void refresh()
Repaints the canvas map.
QgsMapLayer * currentLayer()
returns current layer (set by legend widget)
@ FlagDontInvalidateCachedRendersWhenRangeChanges
Any cached rendering will not be invalidated when z range context is modified.
static QgsRectangle combinedExtent(const QList< QgsMapLayer * > &layers, const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &transformContext)
Returns the combined extent of a list of layers.
Base class for all map layer types.
void autoRefreshIntervalChanged(int interval)
Emitted when the auto refresh interval changes.
void rendererChanged()
Signal emitted when renderer is changed.
void repaintRequested(bool deferredUpdate=false)
By emitting this signal the layer tells that either appearance or content have been changed and any v...
A mouse event which is the result of a user interaction with a QgsMapCanvas.
Responsible for keeping a cache of rendered images resulting from a map rendering job.
void invalidateCacheForLayer(QgsMapLayer *layer)
Invalidates cached images which relate to the specified map layer.
Job implementation that renders everything sequentially using a custom painter.
void waitForFinished() override
Block until the job has finished.
const QgsMapSettings & mapSettings() const
Returns map settings with which this job was started.
void finished()
emitted when asynchronous rendering is finished (or canceled).
static const QgsSettingsEntryBool * settingsLogCanvasRefreshEvent
Settings entry log canvas refresh event.
void start()
Start the rendering job and immediately return.
QList< QgsMapRendererJob::Error > Errors
virtual QImage renderedImage()=0
Gets a preview/resulting image.
static QString worldFileContent(const QgsMapSettings &mapSettings)
Creates the content of a world file.
Contains configuration for rendering maps.
Qgis::DistanceUnit mapUnits() const
Returns the units of the map's geographical coordinates - used for scale calculation.
QList< QgsMapLayer * > layers(bool expandGroupLayers=false) const
Returns the list of layers which will be rendered in the map.
QPolygonF visiblePolygon() const
Returns the visible area as a polygon (may be rotated).
void setLayers(const QList< QgsMapLayer * > &layers)
Sets the list of layers to render in the map.
double scale() const
Returns the calculated map scale.
void setFrameRate(double rate)
Sets the frame rate of the map (in frames per second), for maps which are part of an animation.
QgsRectangle layerExtentToOutputExtent(const QgsMapLayer *layer, QgsRectangle extent) const
transform bounding box from layer's CRS to output CRS
const QgsMapToPixel & mapToPixel() const
double mapUnitsPerPixel() const
Returns the distance in geographical coordinates that equals to one pixel in the map.
QgsRectangle extent() const
Returns geographical coordinates of the rectangle that should be rendered.
void setExtent(const QgsRectangle &rect, bool magnified=true)
Sets the coordinates of the rectangle which should be rendered.
QgsRectangle visibleExtent() const
Returns the actual extent derived from requested extent that takes output image size into account.
QgsRectangle fullExtent() const
returns current extent of layer set
void setCurrentFrame(long long frame)
Sets the current frame of the map, for maps which are part of an animation.
bool testFlag(Qgis::MapSettingsFlag flag) const
Check whether a particular flag is enabled.
double rotation() const
Returns the rotation of the resulting map image, in degrees clockwise.
QgsPointXY mapToLayerCoordinates(const QgsMapLayer *layer, QgsPointXY point) const
transform point coordinates from output CRS to layer's CRS
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination coordinate reference system for the map render.
void setFlag(Qgis::MapSettingsFlag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected).
void readXml(QDomNode &node)
Restore the map settings from a XML node.
void mapThemesChanged()
Emitted when map themes within the collection are changed.
void mapThemeRenamed(const QString &name, const QString &newName)
Emitted when a map theme within the collection is renamed.
void mapThemeChanged(const QString &theme)
Emitted when a map theme changes definition.
Perform transforms between map coordinates and device coordinates.
double mapUnitsPerPixel() const
Returns the current map units per pixel.
QgsPointXY toMapCoordinates(int x, int y) const
Transforms device coordinates to map (world) coordinates.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true, const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE())
Adds a message to the log instance (and creates it if necessary).
static bool isUriList(const QMimeData *data)
QList< QgsMimeDataUtils::Uri > UriList
static UriList decodeUriList(const QMimeData *data)
double sqrDist(double x, double y) const
Returns the squared distance between this point a specified x, y coordinate.
void setY(double y)
Sets the y value of the point.
void setX(double x)
Sets the x value of the point.
A graphics effect which can be applied to a widget to simulate various printing and color blindness m...
QgsReferencedRectangle fullExtent() const
Returns the full extent of the project, which represents the maximal limits of the project.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
static QgsProject * instance()
Returns the QgsProject singleton instance.
Q_INVOKABLE QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
void scaleMethodChanged()
Emitted when the project's scale method is changed.
void ellipsoidChanged(const QString &ellipsoid)
Emitted when the project ellipsoid is changed.
void projectColorsChanged()
Emitted whenever the project's color scheme has been changed.
void elevationShadingRendererChanged()
Emitted when the map shading renderer changes.
void readProject(const QDomDocument &document)
Emitted when a project is being read.
const QgsProjectViewSettings * viewSettings() const
Returns the project's view settings, which contains settings and properties relating to how a QgsProj...
void transformContextChanged()
Emitted when the project transformContext() is changed.
void writeProject(QDomDocument &document)
Emitted when the project is being written.
A container for the context for various read/write operations on objects.
A rectangle specified with double values.
void scale(double scaleFactor, const QgsPointXY *c=nullptr)
Scale the rectangle around its center point.
void combineExtentWith(const QgsRectangle &rect)
Expands the rectangle so that it covers both the original rectangle and the given rectangle.
static QgsRectangle fromCenterAndSize(const QgsPointXY ¢er, double width, double height)
Creates a new rectangle, given the specified center point and width and height.
void setNull()
Mark a rectangle as being null (holding no spatial information).
A QgsRectangle with associated coordinate reference system.
Stores collated details of rendered items during a map rendering operation.
Responsible for drawing transient features (e.g.
void setWidth(double width)
Sets the width of the line.
void setSecondaryStrokeColor(const QColor &color)
Sets a secondary stroke color for the rubberband which will be drawn under the main stroke color.
@ ICON_CIRCLE
A circle is used to highlight points (○).
void setStrokeColor(const QColor &color)
Sets the stroke color for the rubberband.
QColor secondaryStrokeColor
void setIcon(IconType icon)
Sets the icon type to highlight point geometries.
void updatePosition() override
called on changed extent or resize event to update position of the item
void addGeometry(const QgsGeometry &geometry, QgsMapLayer *layer, bool doUpdate=true)
Adds the geometry of an existing feature to a rubberband This is useful for multi feature highlightin...
void setFillColor(const QColor &color)
Sets the fill color for the rubberband.
void clear(const QString &group="startup")
clear Clear all profile data.
Scoped object for saving and restoring a QPainter object's state.
Scoped object for logging of the runtime for a single operation or group of operations.
A utility class for dynamic handling of changes to screen properties.
void screenDpiChanged(double dpi)
Emitted whenever the screen dpi associated with the widget is changed.
static const QgsSettingsEntryBool * settingsRespectScreenDPI
Settings entry respect screen dpi.
Stores settings for use within QGIS.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
T enumValue(const QString &key, const T &defaultValue, const Section section=NoSection)
Returns the setting value for a setting based on an enum.
Contains configuration of snapping and can return answers to snapping queries.
void remoteSvgFetched(const QString &url)
Emitted when the cache has finished retrieving an SVG file from a remote url.
static double rendererFrameRate(const QgsFeatureRenderer *renderer)
Calculates the frame rate (in frames per second) at which the given renderer must be redrawn.
A controller base class for temporal objects, contains a signal for notifying updates of the objects ...
void updateTemporalRange(const QgsDateTimeRange &range)
Signals that a temporal range has changed and needs to be updated in all connected objects.
Implements a temporal controller based on a frame by frame navigation and animation.
void navigationModeChanged(Qgis::TemporalNavigationMode mode)
Emitted whenever the navigation mode changes.
@ FlagDontInvalidateCachedRendersWhenRangeChanges
Any cached rendering will not be invalidated when temporal range context is modified.
T begin() const
Returns the beginning of the range.
T end() const
Returns the upper bound of the range.
Temporarily sets a cursor override for the QApplication for the lifetime of the object.
void release()
Releases the cursor override early (i.e.
Represents a vector layer which manages a vector based dataset.
Q_INVOKABLE QgsRectangle boundingBoxOfSelected() const
Returns the bounding box of the selected features. If there is no selection, QgsRectangle(0,...
int selectedFeatureCount() const
Returns the number of features that are selected in this layer.
Q_INVOKABLE Qgis::GeometryType geometryType() const
Returns point, line or polygon.
void selectionChanged(const QgsFeatureIds &selected, const QgsFeatureIds &deselected, bool clearAndSelect)
Emitted when selection was changed.
Implements a map layer that is dedicated to rendering of vector tiles.
QList< QgsFeature > selectedFeatures() const
Returns the list of features currently selected in the layer.
void selectionChanged()
Emitted whenever the selected features in the layer are changed.
int selectedFeatureCount() const
Returns the number of features that are selected in this layer.
Represent a 2-dimensional vector.
static Qgis::GeometryType geometryType(Qgis::WkbType type)
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
constexpr double CANVAS_MAGNIFICATION_MIN
Minimum magnification level allowed in map canvases.
constexpr double CANVAS_MAGNIFICATION_MAX
Maximum magnification level allowed in map canvases.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
QSet< QgsFeatureId > QgsFeatureIds
#define QgsDebugMsgLevel(str, level)
#define QgsDebugError(str)
QList< QgsMapLayer * > filterLayersForRender(const QList< QgsMapLayer * > &layers)
QgsTemporalRange< QDateTime > QgsDateTimeRange
QgsRange which stores a range of date times.
double maxRenderingTimeMs
Default maximum allowable render time, in ms.
double lastRenderingTimeMs
Previous rendering time for the layer, in ms.