79#include <QApplication>
84#include <QGraphicsItem>
85#include <QGraphicsScene>
86#include <QGraphicsView>
92#include <QPropertyAnimation>
94#include <QResizeEvent>
99#include <QVariantAnimation>
100#include <QWheelEvent>
104#include "moc_qgsmapcanvas.cpp"
106using namespace Qt::StringLiterals;
139 : QGraphicsView( parent )
141 , mExpressionContextScope( tr(
"Map Canvas" ) )
143 mScene =
new QGraphicsScene();
145 setLayout( mLayout );
148 setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
149 setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
150 setMouseTracking(
true );
151 setFocusPolicy( Qt::StrongFocus );
156 mResizeTimer =
new QTimer(
this );
157 mResizeTimer->setSingleShot(
true );
160 mRefreshTimer =
new QTimer(
this );
161 mRefreshTimer->setSingleShot(
true );
162 connect( mRefreshTimer, &QTimer::timeout,
this, &QgsMapCanvas::refreshMap );
165 mMap =
new QgsMapCanvasMap(
this );
203 if ( mSettings.destinationCrs() != crs )
223 QSize s = viewport()->size();
224 mSettings.setOutputSize( s );
228 setSceneRect( 0, 0, s.width(), s.height() );
229 mScene->setSceneRect( QRectF( 0, 0, s.width(), s.height() ) );
233 connect( &mMapUpdateTimer, &QTimer::timeout,
this, &QgsMapCanvas::mapUpdateTimeout );
234 mMapUpdateTimer.setInterval( 250 );
239 grabGesture( Qt::PinchGesture );
240 grabGesture( Qt::TapAndHoldGesture );
241 viewport()->setAttribute( Qt::WA_AcceptTouchEvents );
245 viewport()->setGraphicsEffect( mPreviewEffect );
249 connect( &mAutoRefreshTimer, &QTimer::timeout,
this, &QgsMapCanvas::autoRefreshTriggered );
253 setInteractive(
false );
268 mMapTool->deactivate();
269 disconnect( mMapTool, &QObject::destroyed,
this, &QgsMapCanvas::mapToolDestroyed );
277 const QList<QgsMapTool *> tools = findChildren<QgsMapTool *>();
280 tool->mCanvas =
nullptr;
288 qDeleteAll( mScene->items() );
290 mScene->deleteLater();
295 mLayout->addWidget( widget, edge );
309 for (
auto previewJob = mPreviewJobs.constBegin(); previewJob != mPreviewJobs.constEnd(); ++previewJob )
317 mPreviewJobs.clear();
325 factor = std::clamp( factor, magnifierMin, magnifierMax );
328 if ( !
qgsDoubleNear( factor, mSettings.magnificationFactor(), 0.01 ) )
330 mSettings.setMagnificationFactor( factor,
center );
338 return mSettings.magnificationFactor();
360 if ( index >= 0 && index <
layers.size() )
383 if ( mCurrentLayer ==
layer )
386 mCurrentLayer =
layer;
397 return nullptr != mJob;
410 if ( !mTheme.isEmpty() )
413 setLayersPrivate(
layers );
426void QgsMapCanvas::setLayersPrivate(
const QList<QgsMapLayer *> &layers )
428 const QList<QgsMapLayer *> oldLayers = mSettings.
layers();
431 if (
layers == oldLayers )
450 QgsVectorTileLayer *vtlayer = qobject_cast<QgsVectorTileLayer *>(
layer );
466 mSettings.setLayers(
layers );
468 for ( QgsMapLayer *
layer : std::as_const(
layers ) )
475 switch (
layer->type() )
479 QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>(
layer );
487 QgsVectorTileLayer *vtlayer = qobject_cast<QgsVectorTileLayer *>(
layer );
506 updateAutoRefreshTimer();
523 if ( mSettings.destinationCrs() == crs )
528 if ( !mSettings.visibleExtent().isEmpty() )
546 mBlockExtentChangedSignal++;
547 mBlockScaleChangedSignal++;
553 mBlockItemPositionUpdates++;
555 mBlockItemPositionUpdates--;
558 mBlockExtentChangedSignal--;
559 mBlockScaleChangedSignal--;
561 mSettings.setDestinationCrs( crs );
583 mSettings.setFrameRate( -1 );
584 mSettings.setCurrentFrame( -1 );
587 mController = controller;
593void QgsMapCanvas::temporalControllerModeChanged()
597 switch ( temporalNavigationObject->navigationMode() )
601 mSettings.
setFrameRate( temporalNavigationObject->framesPerSecond() );
602 mSettings.
setCurrentFrame( temporalNavigationObject->currentFrameNumber() );
623 mSettings.setFlags(
flags );
630 if ( !allowOutdatedResults && mLabelingResultsOutdated )
633 return mLabelingResults.get();
638 if ( !allowOutdatedResults && mRenderedItemResultsOutdated )
641 return mRenderedItemResults.get();
649 if ( mJob && mJob->isActive() )
652 mJob->waitForFinished();
657 mCache = std::make_unique<QgsMapRendererCache>();
663 mPreviousRenderedItemResults.reset();
668 return nullptr != mCache.get();
676 if ( mPreviousRenderedItemResults )
677 mPreviousRenderedItemResults.reset();
678 if ( mRenderedItemResults )
679 mRenderedItemResults.reset();
689 mUseParallelRendering = enabled;
694 return mUseParallelRendering;
699 mMapUpdateTimer.setInterval( timeMilliseconds );
704 return mMapUpdateTimer.interval();
710 return mCurrentLayer;
731 expressionContext << generator->createExpressionContextScope();
734 return expressionContext;
739 if ( !mSettings.hasValidSettings() )
741 QgsDebugMsgLevel( u
"CANVAS refresh - invalid settings -> nothing to do"_s, 2 );
745 if ( !mRenderFlag || mFrozen )
751 if ( mRefreshScheduled )
757 mRefreshScheduled =
true;
762 mRefreshTimer->start( 1 );
764 mLabelingResultsOutdated =
true;
765 mRenderedItemResultsOutdated =
true;
770 QList<QgsMapLayer *> filteredLayers;
773 if (
QgsAnnotationLayer *annotationLayer = qobject_cast<QgsAnnotationLayer *>( layer ) )
775 if (
QgsMapLayer *linkedLayer = annotationLayer->linkedVisibilityLayer() )
777 if ( !layers.contains( linkedLayer ) )
781 filteredLayers.append( layer );
785 filteredLayers.erase( std::remove_if( filteredLayers.begin(), filteredLayers.end(), [](
QgsMapLayer *layer ) { return !layer || !layer->isValid(); } ), filteredLayers.end() );
787 return filteredLayers;
790void QgsMapCanvas::refreshMap()
792 Q_ASSERT( mRefreshScheduled );
799 if ( mCacheInvalidations.testFlag( CacheInvalidationType::Temporal ) )
801 clearTemporalCache();
802 mCacheInvalidations &= ~(
static_cast<int>( CacheInvalidationType::Temporal ) );
804 if ( mCacheInvalidations.testFlag( CacheInvalidationType::Elevation ) )
806 clearElevationCache();
807 mCacheInvalidations &= ~(
static_cast<int>( CacheInvalidationType::Elevation ) );
813 if ( QgsTemporalNavigationObject *temporalNavigationObject =
dynamic_cast<QgsTemporalNavigationObject *
>( mController ) )
815 switch ( temporalNavigationObject->navigationMode() )
819 mSettings.setFrameRate( temporalNavigationObject->framesPerSecond() );
820 mSettings.setCurrentFrame( temporalNavigationObject->currentFrameNumber() );
831 if ( !mTheme.isEmpty() )
839 mSettings.setLayerStyleOverrides(
QgsProject::instance()->mapThemeCollection()->mapThemeStyleOverrides( mTheme ) );
843 QgsMapSettings renderSettings = mSettings;
844 QList<QgsMapLayer *> allLayers = renderSettings.
layers();
855 mJobCanceled =
false;
856 if ( mUseParallelRendering )
857 mJob =
new QgsMapRendererParallelJob( renderSettings );
859 mJob =
new QgsMapRendererSequentialJob( renderSettings );
862 mJob->setCache( mCache.get() );
863 mJob->setLayerRenderingTimeHints( mLastLayerRenderTime );
873 mRefreshScheduled =
false;
875 mMapUpdateTimer.start();
880void QgsMapCanvas::mapThemeChanged(
const QString &theme )
882 if (
theme == mTheme )
887 setLayersPrivate(
QgsProject::instance()->mapThemeCollection()->mapThemeVisibleLayers( mTheme ) );
900void QgsMapCanvas::mapThemeRenamed(
const QString &theme,
const QString &newTheme )
902 if ( mTheme.isEmpty() ||
theme != mTheme )
911void QgsMapCanvas::rendererJobFinished()
915 mMapUpdateTimer.stop();
917 notifyRendererErrors( mJob->errors() );
923 if ( !mJob->usedCachedLabels() )
925 mLabelingResults.reset( mJob->takeLabelingResults() );
927 mLabelingResultsOutdated =
false;
929 std::unique_ptr<QgsRenderedItemResults>
renderedItemResults( mJob->takeRenderedItemResults() );
931 if ( mRenderedItemResults )
933 renderedItemResults->transferResults( mRenderedItemResults.get(), mJob->layersRedrawnFromCache() );
935 if ( mPreviousRenderedItemResults )
938 renderedItemResults->transferResults( mPreviousRenderedItemResults.get(), mJob->layersRedrawnFromCache() );
941 if ( mCache && !mPreviousRenderedItemResults )
942 mPreviousRenderedItemResults = std::make_unique<QgsRenderedItemResults>( mJob->mapSettings().extent() );
944 if ( mRenderedItemResults && mPreviousRenderedItemResults )
949 mPreviousRenderedItemResults->transferResults( mRenderedItemResults.get() );
951 if ( mPreviousRenderedItemResults )
953 mPreviousRenderedItemResults->eraseResultsFromLayers( mJob->mapSettings().layerIds() );
957 mRenderedItemResultsOutdated =
false;
959 QImage img = mJob->renderedImage();
967 QString logMsg = tr(
"Canvas refresh: %1 ms" ).arg( mJob->renderingTime() );
971 if ( mDrawRenderingStats )
973 int w = img.width(), h = img.height();
974 QFont fnt = p.font();
977 int lh = p.fontMetrics().height() * 2;
978 QRect r( 0, h - lh, w, lh );
979 p.setPen( Qt::NoPen );
980 p.setBrush( QColor( 0, 0, 0, 110 ) );
982 p.setPen( Qt::white );
983 QString msg = u
"%1 :: %2 ms"_s.arg( mUseParallelRendering ? u
"PARALLEL"_s : u
"SEQUENTIAL"_s ).arg( mJob->renderingTime() );
984 p.drawText( r, msg, QTextOption( Qt::AlignCenter ) );
989 mMap->setContent( img, imageRect( img, mSettings ) );
991 mLastLayerRenderTime.clear();
992 const auto times = mJob->perLayerRenderingTime();
993 for (
auto it = times.constBegin(); it != times.constEnd(); ++it )
995 mLastLayerRenderTime.insert( it.key()->id(), it.value() );
997 if ( mUsePreviewJobs && !mRefreshAfterJob )
1002 mRefreshAfterJob =
false;
1007 mJob->deleteLater();
1012 if ( mRefreshAfterJob )
1014 mRefreshAfterJob =
false;
1019void QgsMapCanvas::previewJobFinished()
1021 QgsMapRendererQImageJob *job = qobject_cast<QgsMapRendererQImageJob *>( sender() );
1027 mPreviewJobs.removeAll( job );
1029 int number = job->property(
"number" ).toInt();
1032 startPreviewJob( number + 1 );
1043 const QgsMapToPixel &m2p =
mapSettings.mapToPixel();
1047 if ( img.devicePixelRatio() !=
mapSettings.devicePixelRatio() )
1053 QgsRectangle rect( topLeft.
x(), topLeft.
y(), topLeft.
x() + img.width() * res, topLeft.
y() - img.height() * res );
1059 return mStatusBar.data();
1069 return mUsePreviewJobs;
1074 mUsePreviewJobs = enabled;
1079 mDropHandlers = handlers;
1082void QgsMapCanvas::clearTemporalCache()
1086 bool invalidateLabels =
false;
1090 bool alreadyInvalidatedThisLayer =
false;
1097 mCache->invalidateCacheForLayer(
layer );
1098 alreadyInvalidatedThisLayer =
true;
1104 if (
layer->temporalProperties() &&
layer->temporalProperties()->isActive() )
1106 if ( QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>(
layer ) )
1109 invalidateLabels =
true;
1115 if ( !alreadyInvalidatedThisLayer )
1117 mCache->invalidateCacheForLayer(
layer );
1120 else if ( QgsGroupLayer *gl = qobject_cast<QgsGroupLayer *>(
layer ) )
1122 const QList<QgsMapLayer *> childLayerList = gl->childLayers();
1123 for ( QgsMapLayer *childLayer : childLayerList )
1125 if ( childLayer->temporalProperties() && childLayer->temporalProperties()->isActive() )
1130 mCache->invalidateCacheForLayer(
layer );
1137 if ( invalidateLabels )
1139 mCache->clearCacheImage( u
"_labels_"_s );
1140 mCache->clearCacheImage( u
"_preview_labels_"_s );
1145void QgsMapCanvas::clearElevationCache()
1149 bool invalidateLabels =
false;
1151 for ( QgsMapLayer *
layer : layerList )
1153 if (
layer->elevationProperties() &&
layer->elevationProperties()->hasElevation() )
1155 if ( QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>(
layer ) )
1158 invalidateLabels =
true;
1164 mCache->invalidateCacheForLayer(
layer );
1166 else if ( QgsGroupLayer *gl = qobject_cast<QgsGroupLayer *>(
layer ) )
1168 const QList<QgsMapLayer *> childLayerList = gl->childLayers();
1169 for ( QgsMapLayer *childLayer : childLayerList )
1171 if ( childLayer->elevationProperties() && childLayer->elevationProperties()->hasElevation() )
1176 mCache->invalidateCacheForLayer(
layer );
1183 if ( invalidateLabels )
1185 mCache->clearCacheImage( u
"_labels_"_s );
1186 mCache->clearCacheImage( u
"_preview_labels_"_s );
1193 const QgsPointXY mapPoint =
event->originalMapPoint();
1197 QMenu *copyCoordinateMenu =
new QMenu( tr(
"Copy Coordinate" ), &menu );
1200 auto addCoordinateFormat = [&,
this](
const QString identifier,
const QgsCoordinateReferenceSystem &crs ) {
1201 const QgsCoordinateTransform ct( mSettings.destinationCrs(), crs, mSettings.transformContext() );
1204 const QgsPointXY transformedPoint = ct.transform( mapPoint );
1207 int displayPrecision = 0;
1210 QgsCoordinateTransform extentTransform = ct;
1215 displayPrecision = 0;
1217 displayPrecision = 1;
1219 displayPrecision = 2;
1221 displayPrecision = 3;
1223 displayPrecision = 4;
1225 displayPrecision = 5;
1227 displayPrecision = 6;
1229 displayPrecision = 7;
1231 displayPrecision = 8;
1233 displayPrecision = 9;
1235 catch ( QgsCsException & )
1240 const QList<Qgis::CrsAxisDirection> axisList = crs.axisOrdering();
1241 QString firstSuffix;
1242 QString secondSuffix;
1243 if ( axisList.size() >= 2 )
1249 QString firstNumber;
1250 QString secondNumber;
1253 firstNumber = QString::number( transformedPoint.
y(),
'f', displayPrecision );
1254 secondNumber = QString::number( transformedPoint.
x(),
'f', displayPrecision );
1258 firstNumber = QString::number( transformedPoint.
x(),
'f', displayPrecision );
1259 secondNumber = QString::number( transformedPoint.
y(),
'f', displayPrecision );
1262 QAction *copyCoordinateAction =
new QAction( u
"%5 (%1%2, %3%4)"_s.arg( firstNumber, firstSuffix, secondNumber, secondSuffix, identifier ), &menu );
1264 connect( copyCoordinateAction, &QAction::triggered,
this, [firstNumber, firstSuffix, secondNumber, secondSuffix, transformedPoint] {
1265 QClipboard *clipboard = QApplication::clipboard();
1267 const QString coordinates = u
"%1%2, %3%4"_s.arg( firstNumber, firstSuffix, secondNumber, secondSuffix );
1270 if ( clipboard->supportsSelection() )
1272 clipboard->setText( coordinates, QClipboard::Selection );
1274 clipboard->setText( coordinates, QClipboard::Clipboard );
1276 copyCoordinateMenu->addAction( copyCoordinateAction );
1278 catch ( QgsCsException & )
1283 QgsCoordinateReferenceSystem wgs84( u
"EPSG:4326"_s );
1284 if ( mSettings.destinationCrs() != wgs84 )
1287 QgsSettings settings;
1289 if ( !customCrsString.isEmpty() )
1291 QgsCoordinateReferenceSystem customCrs( customCrsString );
1292 if ( customCrs != mSettings.destinationCrs() && customCrs != QgsCoordinateReferenceSystem( u
"EPSG:4326"_s ) )
1297 copyCoordinateMenu->addSeparator();
1298 QAction *setCustomCrsAction =
new QAction( tr(
"Set Custom CRS…" ), &menu );
1299 connect( setCustomCrsAction, &QAction::triggered,
this, [
this, customCrsString] {
1300 QgsProjectionSelectionDialog selector(
this );
1301 selector.setCrs( QgsCoordinateReferenceSystem( customCrsString ) );
1302 if ( selector.exec() )
1307 copyCoordinateMenu->addAction( setCustomCrsAction );
1309 menu.addMenu( copyCoordinateMenu );
1312 if ( !
mapTool()->populateContextMenuWithEvent( &menu,
event ) )
1313 mMapTool->populateContextMenu( &menu );
1317 if ( !menu.isEmpty() )
1318 menu.exec(
event->globalPos() );
1323 const QDateTime currentTime = QDateTime::currentDateTime();
1326 for (
const QgsMapRendererJob::Error &error : errors )
1328 const QString errorKey = error.layerID +
':' + error.message;
1329 if ( mRendererErrors.contains( errorKey ) )
1331 const QDateTime sameErrorTime = mRendererErrors.value( errorKey );
1333 if ( sameErrorTime.secsTo( currentTime ) < 60 )
1337 mRendererErrors[errorKey] = currentTime;
1344void QgsMapCanvas::updateDevicePixelFromScreen()
1346 mSettings.setDevicePixelRatio(
static_cast<float>( devicePixelRatioF() ) );
1350 if ( window()->windowHandle() )
1352 mSettings.setOutputDpi( window()->windowHandle()->screen()->physicalDotsPerInch() );
1353 mSettings.setDpiTarget( window()->windowHandle()->screen()->physicalDotsPerInch() );
1359 mSettings.setOutputDpi( window()->windowHandle()->screen()->logicalDotsPerInch() );
1360 mSettings.setDpiTarget( window()->windowHandle()->screen()->logicalDotsPerInch() );
1365void QgsMapCanvas::onElevationShadingRendererChanged()
1369 bool wasDeactivated = !mSettings.elevationShadingRenderer().isActive();
1370 mSettings.setElevationShadingRenderer( mProject->elevationShadingRenderer() );
1371 if ( mCache && wasDeactivated )
1381 mSettings.setTemporalRange( dateTimeRange );
1382 mSettings.setIsTemporal( dateTimeRange.
begin().isValid() || dateTimeRange.
end().isValid() );
1388 mCacheInvalidations |= CacheInvalidationType::Temporal;
1390 autoRefreshTriggered();
1395 return mSettings.temporalRange();
1400 mInteractionBlockers.append( blocker );
1405 mInteractionBlockers.removeAll( blocker );
1412 if ( block->blockCanvasInteraction( interaction ) )
1420 if ( mMapController )
1422 delete mMapController;
1423 mMapController =
nullptr;
1429 mMapController = controller;
1430 mMapController->setParent(
this );
1434 connect( mMapController, &QgsAbstract2DMapController::zoomMap,
this, [](
double factor ) {
zoomByFactor( factor ); } );
1438void QgsMapCanvas::mapUpdateTimeout()
1443 mMap->setContent( img, imageRect( img, mSettings ) );
1452 mJobCanceled =
true;
1455 mJob->cancelWithoutBlocking();
1473 image = theQPixmap->toImage();
1474 painter.begin( &image );
1484 image = mMap->contentImage().copy();
1485 painter.begin( &image );
1489 QStyleOptionGraphicsItem option;
1490 option.initFrom(
this );
1491 QGraphicsItem *item =
nullptr;
1492 QListIterator<QGraphicsItem *> i( items() );
1494 while ( i.hasPrevious() )
1496 item = i.previous();
1505 QPointF itemScenePos = item->scenePos();
1506 painter.translate( itemScenePos.x(), itemScenePos.y() );
1508 item->paint( &painter, &option );
1512 image.save( fileName, format.toLocal8Bit().data() );
1514 QFileInfo myInfo = QFileInfo( fileName );
1517 QString outputSuffix = myInfo.suffix();
1518 QString myWorldFileName = myInfo.absolutePath() +
'/' + myInfo.completeBaseName() +
'.' + outputSuffix.at( 0 ) + outputSuffix.at( myInfo.suffix().size() - 1 ) +
'w';
1519 QFile myWorldFile( myWorldFileName );
1520 if ( !myWorldFile.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
1524 QTextStream myStream( &myWorldFile );
1560 if ( ( r == current ) && magnified )
1565 if ( !mSettings.hasValidSettings() )
1573 QgsDebugMsgLevel( u
"Empty extent - keeping old scale with new center!"_s, 2 );
1582 if ( mScaleLocked && magnified )
1584 ScaleRestorer restorer(
this );
1589 mSettings.setMagnificationFactor( scaleFactor, &newCenter );
1594 mSettings.setExtent( r, magnified );
1601 for (
int i = mLastExtent.size() - 1; i > mLastExtentIndex; i-- )
1603 mLastExtent.removeAt( i );
1606 if ( !mLastExtent.isEmpty() && mLastExtent.last() != mSettings.extent() )
1608 mLastExtent.append( mSettings.extent() );
1612 if ( mLastExtent.size() > 100 )
1614 mLastExtent.removeAt( 0 );
1618 mLastExtentIndex = mLastExtent.size() - 1;
1664 return mCursorPoint;
1679 mSettings.setRotation( degrees );
1686 if ( !mBlockScaleChangedSignal )
1719 if ( mLastExtentIndex > 0 )
1722 mSettings.setExtent( mLastExtent[mLastExtentIndex] );
1735 if ( mLastExtentIndex < mLastExtent.size() - 1 )
1738 mSettings.setExtent( mLastExtent[mLastExtentIndex] );
1750 mLastExtent.clear();
1751 mLastExtent.append( mSettings.extent() );
1752 mLastExtentIndex = mLastExtent.size() - 1;
1770 double closestSquaredDistance = pow( extentRect.
width(), 2.0 ) + pow( extentRect.
height(), 2.0 );
1771 bool pointFound =
false;
1775 double sqrDist = point.
sqrDist( centerLayerCoordinates );
1776 if ( sqrDist > closestSquaredDistance || sqrDist < 4 * std::numeric_limits<double>::epsilon() )
1779 closestPoint = point;
1780 closestSquaredDistance = sqrDist;
1785 rect.combineExtentWith( mSettings.layerToMapCoordinates(
layer, closestPoint ) );
1786 rect.scale( scaleFactor, &
center );
1799 layer = mCurrentLayer;
1807 switch (
layer->type() )
1829 rect = optimalExtentForPointLayer( vlayer, rect.
center() );
1841 for (
const QgsFeature &feature : selectedFeatures )
1843 if ( !feature.hasGeometry() )
1882 if ( !mapLayer || !mapLayer->isSpatial() )
1885 switch ( mapLayer->type() )
1891 if (
layer->selectedFeatureCount() == 0 )
1894 rect =
layer->boundingBoxOfSelected();
1902 rect = optimalExtentForPointLayer(
layer, rect.
center() );
1916 for (
const QgsFeature &feature : selectedFeatures )
1918 if ( !feature.hasGeometry() )
1940 if ( selectionExtent.
isNull() )
1951 return mSettings.zRange();
1959 mSettings.setZRange( range );
1965 mCacheInvalidations |= CacheInvalidationType::Elevation;
1967 autoRefreshTriggered();
2003 if ( boundingBoxOfFeatureIds( ids,
layer, bbox, errorMsg ) )
2007 bbox = optimalExtentForPointLayer(
layer, bbox.
center() );
2026 if ( boundingBoxOfFeatureIds( ids,
layer, bbox, errorMsg ) )
2043 int featureCount = 0;
2051 errorMsg = tr(
"Feature does not have a geometry" );
2055 errorMsg = tr(
"Feature geometry is empty" );
2057 if ( !errorMsg.isEmpty() )
2066 if ( featureCount != ids.count() )
2068 errorMsg = tr(
"Feature not found" );
2080 layer = mCurrentLayer;
2086 switch (
layer->type() )
2104 for (
const QgsFeature &feature : selectedFeatures )
2106 if ( !feature.hasGeometry() )
2142 if ( !mapLayer || !mapLayer->isSpatial() )
2146 switch ( mapLayer->type() )
2151 if (
layer->selectedFeatureCount() == 0 )
2154 rect =
layer->boundingBoxOfSelected();
2162 rect = optimalExtentForPointLayer(
layer, rect.
center() );
2173 for (
const QgsFeature &feature : selectedFeatures )
2175 if ( !feature.hasGeometry() )
2198 if ( selectionExtent.
isNull() )
2215 QList<QgsGeometry> geoms;
2231 if ( geometries.isEmpty() )
2249 QColor startColor = color1;
2250 if ( !startColor.isValid() )
2260 startColor.setAlpha( 255 );
2262 QColor endColor = color2;
2263 if ( !endColor.isValid() )
2265 endColor = startColor;
2266 endColor.setAlpha( 0 );
2270 QVariantAnimation *animation =
new QVariantAnimation(
this );
2271 connect( animation, &QVariantAnimation::finished,
this, [animation, rb] {
2272 animation->deleteLater();
2275 connect( animation, &QPropertyAnimation::valueChanged,
this, [rb, geomType](
const QVariant &value ) {
2276 QColor
c = value.value<QColor>();
2285 c.setAlpha(
c.alpha() );
2291 animation->setDuration( duration * flashes );
2292 animation->setStartValue( endColor );
2293 double midStep = 0.2 / flashes;
2294 for (
int i = 0; i < flashes; ++i )
2296 double start =
static_cast<double>( i ) / flashes;
2297 animation->setKeyValueAt( start + midStep, startColor );
2298 double end =
static_cast<double>( i + 1 ) / flashes;
2300 animation->setKeyValueAt( end, endColor );
2302 animation->setEndValue( endColor );
2324 mMapTool->keyPressEvent( e );
2325 if ( !e->isAccepted() )
2330 double dx = std::fabs( currentExtent.
width() / 4 );
2331 double dy = std::fabs( currentExtent.
height() / 4 );
2363 if ( !e->isAutoRepeat() )
2365 mTemporaryCursorOverride = std::make_unique<QgsTemporaryCursorOverride>( Qt::ClosedHandCursor );
2371 case Qt::Key_PageUp:
2376 case Qt::Key_PageDown:
2383 mUseParallelRendering = !mUseParallelRendering;
2388 mDrawRenderingStats = !mDrawRenderingStats;
2416 mTemporaryCursorOverride.reset();
2426 mMapTool->keyReleaseEvent( e );
2431 QgsDebugMsgLevel(
"Ignoring key release: " + QString::number( e->key() ), 2 );
2444 auto me = std::make_unique<QgsMapMouseEvent>(
this, e );
2445 mMapTool->canvasDoubleClickEvent( me.get() );
2450void QgsMapCanvas::beginZoomRect( QPoint pos )
2452 mZoomRect.setRect( 0, 0, 0, 0 );
2453 mTemporaryCursorOverride = std::make_unique<QgsTemporaryCursorOverride>( mZoomCursor );
2454 mZoomDragging =
true;
2456 QColor color( Qt::blue );
2457 color.setAlpha( 63 );
2458 mZoomRubberBand->setColor( color );
2459 mZoomRect.setTopLeft( pos );
2462void QgsMapCanvas::stopZoomRect()
2464 if ( mZoomDragging )
2466 mZoomDragging =
false;
2467 mZoomRubberBand.reset(
nullptr );
2468 mTemporaryCursorOverride.reset();
2472void QgsMapCanvas::endZoomRect( QPoint pos )
2477 mZoomRect.setRight( pos.x() );
2478 mZoomRect.setBottom( pos.y() );
2481 mZoomRect = mZoomRect.normalized();
2483 if ( mZoomRect.width() < 5 && mZoomRect.height() < 5 )
2490 const QSize &zoomRectSize = mZoomRect.size();
2491 const QSize &canvasSize = mSettings.outputSize();
2492 double sfx =
static_cast<double>( zoomRectSize.width() ) / canvasSize.width();
2493 double sfy =
static_cast<double>( zoomRectSize.height() ) / canvasSize.height();
2494 double sf = std::max( sfx, sfy );
2496 QgsPointXY
c = mSettings.mapToPixel().toMapCoordinates( mZoomRect.center() );
2502void QgsMapCanvas::startPan()
2507 mTemporaryCursorOverride = std::make_unique<QgsTemporaryCursorOverride>( Qt::ClosedHandCursor );
2512void QgsMapCanvas::stopPan()
2517 mTemporaryCursorOverride.reset();
2525 if ( e->button() == Qt::MiddleButton && e->modifiers() & Qt::ShiftModifier )
2527 beginZoomRect( e->pos() );
2531 else if ( e->button() == Qt::MiddleButton )
2545 if ( mMapTool->flags() &
QgsMapTool::AllowZoomRect && e->button() == Qt::LeftButton && e->modifiers() & Qt::ShiftModifier )
2547 beginZoomRect( e->pos() );
2552 auto me = std::make_unique<QgsMapMouseEvent>(
this, e );
2553 showContextMenu( me.get() );
2558 auto me = std::make_unique<QgsMapMouseEvent>(
this, e );
2559 mMapTool->canvasPressEvent( me.get() );
2576 if ( mZoomDragging && e->button() == Qt::MiddleButton )
2578 endZoomRect( e->pos() );
2582 else if ( e->button() == Qt::MiddleButton )
2586 else if ( e->button() == Qt::BackButton )
2591 else if ( e->button() == Qt::ForwardButton )
2598 if ( mZoomDragging && e->button() == Qt::LeftButton )
2600 endZoomRect( e->pos() );
2607 auto me = std::make_unique<QgsMapMouseEvent>(
this, e );
2608 mMapTool->canvasReleaseEvent( me.get() );
2621 QGraphicsView::resizeEvent( e );
2622 mResizeTimer->start( 500 );
2624 double oldScale = mSettings.scale();
2625 QSize lastSize = viewport()->size();
2626 mSettings.setOutputSize( lastSize );
2628 mScene->setSceneRect( QRectF( 0, 0, lastSize.width(), lastSize.height() ) );
2634 double scaleFactor = oldScale / mSettings.scale();
2638 mSettings.setExtent( r );
2652 QGraphicsView::paintEvent( e );
2657 if ( mBlockItemPositionUpdates )
2660 const QList<QGraphicsItem *> items = mScene->items();
2661 for ( QGraphicsItem *gi : items )
2678 QgsDebugMsgLevel(
"Wheel event delta " + QString::number( e->angleDelta().y() ), 2 );
2682 mMapTool->wheelEvent( e );
2683 if ( e->isAccepted() )
2687 if ( e->angleDelta().y() == 0 )
2694 bool zoomIn = reverseZoom ? e->angleDelta().y() < 0 : e->angleDelta().y() > 0;
2698 zoomFactor = 1.0 + ( zoomFactor - 1.0 ) / 120.0 * std::fabs( e->angleDelta().y() );
2700 if ( e->modifiers() & Qt::ControlModifier )
2703 zoomFactor = 1.0 + ( zoomFactor - 1.0 ) / 20.0;
2706 double signedWheelFactor =
zoomIn ? 1 / zoomFactor : zoomFactor;
2711 QgsPointXY newCenter( mousePos.
x() + ( ( oldCenter.
x() - mousePos.
x() ) * signedWheelFactor ), mousePos.
y() + ( ( oldCenter.
y() - mousePos.
y() ) * signedWheelFactor ) );
2719 mWheelZoomFactor = std::max( factor, 1.01 );
2748 ScaleRestorer restorer(
this );
2759 if ( mScaleLocked != isLocked )
2761 mScaleLocked = isLocked;
2774 else if ( mZoomDragging )
2776 mZoomRect.setBottomRight( e->pos() );
2777 mZoomRubberBand->setToCanvasRectangle( mZoomRect );
2778 mZoomRubberBand->show();
2785 auto me = std::make_unique<QgsMapMouseEvent>(
this, e );
2786 mMapTool->canvasMoveEvent( me.get() );
2791 if ( !panOperationInProgress() )
2803 if ( tool == mMapTool )
2805 mMapTool->reactivate();
2814 disconnect( mMapTool, &QObject::destroyed,
this, &QgsMapCanvas::mapToolDestroyed );
2815 mMapTool->deactivate();
2825 connect( mMapTool, &QObject::destroyed,
this, &QgsMapCanvas::mapToolDestroyed );
2826 mMapTool->activate();
2833 if ( mMapTool && mMapTool == tool )
2835 disconnect( mMapTool, &QObject::destroyed,
this, &QgsMapCanvas::mapToolDestroyed );
2840 setCursor( Qt::ArrowCursor );
2861 mSettings.setBackgroundColor( color );
2864 QBrush bgBrush( color );
2865 setBackgroundBrush( bgBrush );
2868 palette.setColor( backgroundRole(), color );
2869 setPalette( palette );
2873 mScene->setBackgroundBrush( bgBrush );
2882 return mScene->backgroundBrush().color();
2887 if ( mSettings.selectionColor() == color )
2890 mSettings.setSelectionColor( color );
2894 bool hasSelectedFeatures =
false;
2895 const auto layers = mSettings.layers();
2901 hasSelectedFeatures =
true;
2906 if ( hasSelectedFeatures )
2916 return mSettings.selectionColor();
2957 return mSettings.layerStyleOverrides();
2962 if ( overrides == mSettings.layerStyleOverrides() )
2965 mSettings.setLayerStyleOverrides( overrides );
2972 if ( mTheme ==
theme )
2979 mSettings.setLayerStyleOverrides( QMap<QString, QString>() );
2986 setLayersPrivate(
QgsProject::instance()->mapThemeCollection()->mapThemeVisibleLayers( mTheme ) );
3004void QgsMapCanvas::connectNotify(
const char *signal )
3011void QgsMapCanvas::layerRepaintRequested(
bool deferred )
3017void QgsMapCanvas::autoRefreshTriggered()
3023 mRefreshAfterJob =
true;
3030void QgsMapCanvas::updateAutoRefreshTimer()
3034 int minAutoRefreshInterval = -1;
3035 const auto layers = mSettings.layers();
3038 int layerRefreshInterval = 0;
3040 if (
layer->hasAutoRefreshEnabled() &&
layer->autoRefreshInterval() > 0 )
3042 layerRefreshInterval =
layer->autoRefreshInterval();
3044 else if ( QgsVectorLayer *vectorLayer = qobject_cast<QgsVectorLayer *>(
layer ) )
3046 if (
const QgsFeatureRenderer *renderer = vectorLayer->renderer() )
3049 if ( rendererRefreshRate > 0 )
3051 layerRefreshInterval = 1000 / rendererRefreshRate;
3056 if ( layerRefreshInterval == 0 )
3059 minAutoRefreshInterval = minAutoRefreshInterval > 0 ? std::min( layerRefreshInterval, minAutoRefreshInterval ) : layerRefreshInterval;
3062 if ( minAutoRefreshInterval > 0 )
3064 mAutoRefreshTimer.setInterval( minAutoRefreshInterval );
3065 mAutoRefreshTimer.start();
3069 mAutoRefreshTimer.stop();
3073void QgsMapCanvas::projectThemesChanged()
3075 if ( mTheme.isEmpty() )
3105 double dx = end.
x() - start.
x();
3106 double dy = end.
y() - start.
y();
3108 c.set(
c.x() - dx,
c.y() - dy );
3131 emit
panDistanceBearingChanged( mDa.measureLine( currentMapPoint, startMapPoint ), mDa.lengthUnits(), mDa.bearing( currentMapPoint, startMapPoint ) * 180 / M_PI );
3146 setSceneRect( -pnt.x(), -pnt.y(), viewport()->size().width(), viewport()->size().height() );
3154 bool allHandled =
true;
3157 bool handled =
false;
3160 if ( handler && handler->customUriProviderKey() == uri.providerKey )
3162 if ( handler->handleCustomUriCanvasDrop( uri,
this ) )
3186 updateDevicePixelFromScreen();
3191 if ( !mBlockExtentChangedSignal )
3202 if ( !mPreviewEffect )
3207 mPreviewEffect->setEnabled( previewEnabled );
3212 if ( !mPreviewEffect )
3217 return mPreviewEffect->isEnabled();
3222 if ( !mPreviewEffect )
3227 mPreviewEffect->setMode( mode );
3232 if ( !mPreviewEffect )
3237 return mPreviewEffect->mode();
3242 if ( !mSnappingUtils )
3248 return mSnappingUtils;
3253 mSnappingUtils = utils;
3260 QDomNodeList nodes = doc.elementsByTagName( u
"mapcanvas"_s );
3261 if ( nodes.count() )
3263 QDomNode node = nodes.item( 0 );
3266 if ( nodes.count() > 1 )
3268 for (
int i = 0; i < nodes.size(); ++i )
3270 QDomElement elementNode = nodes.at( i ).toElement();
3272 if ( elementNode.hasAttribute( u
"name"_s ) && elementNode.attribute( u
"name"_s ) == objectName() )
3274 node = nodes.at( i );
3282 if ( objectName() !=
"theMapCanvas"_L1 )
3287 if (
QgsProject::instance()->viewSettings()->restoreProjectExtentOnProjectLoad() && objectName() ==
"theMapCanvas"_L1 )
3300 QDomElement elem = node.toElement();
3301 if ( elem.hasAttribute( u
"theme"_s ) )
3303 if (
QgsProject::instance()->mapThemeCollection()->hasMapTheme( elem.attribute( u
"theme"_s ) ) )
3305 setTheme( elem.attribute( u
"theme"_s ) );
3311 const QDomNodeList scopeElements = elem.elementsByTagName( u
"expressionContextScope"_s );
3312 if ( scopeElements.size() > 0 )
3314 const QDomElement scopeElement = scopeElements.at( 0 ).toElement();
3320 QgsDebugMsgLevel( u
"Couldn't read mapcanvas information from project"_s, 2 );
3321 if ( !
project->viewSettings()->defaultViewExtent().isNull() )
3335 QDomNodeList nl = doc.elementsByTagName( u
"qgis"_s );
3338 QgsDebugError( u
"Unable to find qgis element in project file"_s );
3341 QDomNode qgisNode = nl.item( 0 );
3343 QDomElement mapcanvasNode = doc.createElement( u
"mapcanvas"_s );
3344 mapcanvasNode.setAttribute( u
"name"_s, objectName() );
3345 if ( !mTheme.isEmpty() )
3346 mapcanvasNode.setAttribute( u
"theme"_s, mTheme );
3347 mapcanvasNode.setAttribute( u
"annotationsVisible"_s, mAnnotationsVisible );
3348 qgisNode.appendChild( mapcanvasNode );
3350 mSettings.writeXml( mapcanvasNode, doc );
3353 QDomElement scopeElement = doc.createElement( u
"expressionContextScope"_s );
3361 mapcanvasNode.appendChild( scopeElement );
3368 if ( mScaleLocked && !ignoreScaleLock )
3370 ScaleRestorer restorer(
this );
3405 bool allHandled =
true;
3408 bool handled =
false;
3411 if ( handler->canHandleCustomUriCanvasDrop( uri,
this ) )
3433 if (
event->type() == QEvent::ToolTip && mMapTool && mMapTool->canvasToolTipEvent( qgis::down_cast<QHelpEvent *>(
event ) ) )
3437 return QGraphicsView::viewportEvent(
event );
3440void QgsMapCanvas::mapToolDestroyed()
3448 if ( e->type() == QEvent::Gesture )
3450 if ( QTapAndHoldGesture *tapAndHoldGesture = qobject_cast<QTapAndHoldGesture *>(
static_cast<QGestureEvent *
>( e )->gesture( Qt::TapAndHoldGesture ) ) )
3452 QPointF pos = tapAndHoldGesture->position();
3453 pos = mapFromGlobal( QPoint( pos.x(), pos.y() ) );
3461 return mMapTool->gestureEvent(
static_cast<QGestureEvent *
>( e ) );
3466 return QGraphicsView::event( e );
3492 while ( mRefreshScheduled || mJob )
3494 QgsApplication::processEvents();
3500 mSettings.setSegmentationTolerance( tolerance );
3505 mSettings.setSegmentationToleranceType( type );
3510 QList<QgsMapCanvasAnnotationItem *> annotationItemList;
3511 const QList<QGraphicsItem *> items = mScene->items();
3512 for ( QGraphicsItem *gi : items )
3517 annotationItemList.push_back( aItem );
3521 return annotationItemList;
3526 mAnnotationsVisible = show;
3530 item->setVisible( show );
3536 mSettings.setLabelingEngineSettings( settings );
3541 return mSettings.labelingEngineSettings();
3546 mSettings.setSelectiveMaskingSourceSets( sets );
3549void QgsMapCanvas::startPreviewJobs()
3552 schedulePreviewJob( 0 );
3555void QgsMapCanvas::startPreviewJob(
int number )
3565 const QgsRectangle mapRect =
mapSettings.visibleExtent();
3566 QgsPointXY jobCenter = mapRect.
center();
3567 const double dx = ( i - 1 ) * mapRect.
width();
3568 const double dy = ( 1 - j ) * mapRect.
height();
3571 const double radians = mSettings.rotation() * M_PI / 180;
3572 const double rdx = dx * cos( radians ) - dy * sin( radians );
3573 const double rdy = dy * cos( radians ) + dx * sin( radians );
3574 jobCenter.
setX( jobCenter.
x() + rdx );
3575 jobCenter.
setY( jobCenter.
y() + rdy );
3579 jobCenter.
setX( jobCenter.
x() + dx );
3580 jobCenter.
setY( jobCenter.
y() + dy );
3585 QgsMapSettings jobSettings = mSettings;
3593 const QList<QgsMapLayer *>
layers = jobSettings.
layers();
3594 QList<QgsMapLayer *> previewLayers;
3595 QgsDataProvider::PreviewContext context;
3599 if (
layer->customProperty( u
"rendering/noPreviewJobs"_s,
false ).toBool() )
3601 QgsDebugMsgLevel( u
"Layer %1 not rendered because it is explicitly blocked from preview jobs"_s.arg(
layer->id() ), 3 );
3605 QgsDataProvider *provider =
layer->dataProvider();
3608 QgsDebugMsgLevel( u
"Layer %1 not rendered because it does not match the renderInPreview criterion %2"_s.arg(
layer->id() ).arg( mLastLayerRenderTime.value(
layer->id() ) ), 3 );
3612 previewLayers <<
layer;
3620 QgsMapRendererQImageJob *job =
new QgsMapRendererSequentialJob( jobSettings );
3621 job->setProperty(
"number", number );
3622 mPreviewJobs.append( job );
3627void QgsMapCanvas::stopPreviewJobs()
3629 mPreviewTimer.stop();
3630 for (
auto previewJob = mPreviewJobs.constBegin(); previewJob != mPreviewJobs.constEnd(); ++previewJob )
3636 ( *previewJob )->cancelWithoutBlocking();
3639 mPreviewJobs.clear();
3642void QgsMapCanvas::schedulePreviewJob(
int number )
3644 mPreviewTimer.setSingleShot(
true );
3646 disconnect( mPreviewTimerConnection );
3647 mPreviewTimerConnection = connect( &mPreviewTimer, &QTimer::timeout,
this, [
this, number]() { startPreviewJob( number ); } );
3648 mPreviewTimer.start();
3651bool QgsMapCanvas::panOperationInProgress()
3656 if ( QgsMapToolPan *panTool = qobject_cast<QgsMapToolPan *>( mMapTool ) )
3658 if ( panTool->isDragging() )
3665int QgsMapCanvas::nextZoomLevel(
const QList<double> &resolutions,
bool zoomIn )
const
3667 int resolutionLevel = -1;
3669 int nResolutions = resolutions.size();
3671 for (
int i = 0; i < nResolutions; ++i )
3673 if (
qgsDoubleNear( resolutions[i], currentResolution, 0.0001 ) )
3675 resolutionLevel =
zoomIn ? ( i - 1 ) : ( i + 1 );
3678 else if ( currentResolution <= resolutions[i] )
3680 resolutionLevel =
zoomIn ? ( i - 1 ) : i;
3683 resolutionLevel =
zoomIn ? i : i + 1;
3686 if ( resolutionLevel < 0 || resolutionLevel >= nResolutions )
3690 if (
zoomIn && resolutionLevel == nResolutions - 1 && resolutions[nResolutions - 1] < currentResolution / mWheelZoomFactor )
3695 if ( !
zoomIn && resolutionLevel == 0 && resolutions[0] > mWheelZoomFactor * currentResolution )
3700 return resolutionLevel;
3705 if ( !mZoomResolutions.isEmpty() )
3707 int zoomLevel = nextZoomLevel( mZoomResolutions,
true );
3708 if ( zoomLevel != -1 )
3713 return 1 / mWheelZoomFactor;
3718 if ( !mZoomResolutions.isEmpty() )
3720 int zoomLevel = nextZoomLevel( mZoomResolutions,
false );
3721 if ( zoomLevel != -1 )
3726 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.
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.
QgsStatusBar * statusBar()
Returns the associated status bar.
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 setStatusBar(QgsStatusBar *bar)
Sets the associated status bar.
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 setSelectiveMaskingSourceSets(const QVector< QgsSelectiveMaskingSourceSet > &sets)
Sets a list of all selective masking source sets defined for the map canvas.
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.
static const QgsSettingsEntryString * settingsCustomCoordinateCrs
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.
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 bool isValidExtent(const QgsRectangle &extent)
Returns true if an extent is a valid extent which can be used by QgsMapSettings.
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(), Qgis::StringFormat format=Qgis::StringFormat::PlainText)
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.
T value(const QString &dynamicKeyPart=QString()) const
Returns settings value.
bool setValue(const T &value, const QString &dynamicKeyPart=QString()) const
Set settings value.
static const QgsSettingsEntryDouble * settingsSegmentationTolerance
Settings entry segmentation tolerance for curved geometries.
static const QgsSettingsEntryBool * settingsRespectScreenDPI
Settings entry respect screen dpi.
static const QgsSettingsEntryEnumFlag< QgsAbstractGeometry::SegmentationToleranceType > * settingsSegmentationToleranceType
Settings entry segmentation tolerance type for curved geometries.
static const QgsSettingsEntryDouble * settingsZoomFactor
Settings entry zoom factor.
static const QgsSettingsEntryBool * settingsReverseWheelZoom
Settings entry reverse wheel zoom.
static QgsSettingsTreeNode * sTreeMap
Contains configuration of snapping and can return answers to snapping queries.
A proxy widget for QStatusBar.
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.