diff --git a/src/gui/qgsmaptip.cpp b/src/gui/qgsmaptip.cpp index 3b32feaafc00..117105621b4c 100644 --- a/src/gui/qgsmaptip.cpp +++ b/src/gui/qgsmaptip.cpp @@ -23,6 +23,7 @@ #include "qgswebview.h" #include "qgswebframe.h" #include "qgsapplication.h" +#include "qgsrenderer.h" #include "qgsexpressioncontextutils.h" // Qt includes @@ -212,12 +213,38 @@ QString QgsMapTip::fetchFeature( QgsMapLayer *layer, QgsPointXY &mapPosition, Qg exp.prepare( &context ); request.setSubsetOfAttributes( exp.referencedColumns(), vlayer->fields() ); } + + QgsRenderContext renderCtx = QgsRenderContext::fromMapSettings( mapCanvas->mapSettings() ); + renderCtx.expressionContext() << QgsExpressionContextUtils::layerScope( vlayer ); + + bool filter = false; + std::unique_ptr< QgsFeatureRenderer > renderer; + if ( vlayer->renderer() ) + { + renderer.reset( vlayer->renderer()->clone() ); + renderer->startRender( renderCtx, vlayer->fields() ); + filter = renderer->capabilities() & QgsFeatureRenderer::Filter; + + const QString filterExpression = renderer->filter( vlayer->fields() ); + if ( ! filterExpression.isEmpty() ) + { + request.setFilterExpression( filterExpression ); + } + } + QgsFeatureIterator it = vlayer->getFeatures( request ); QElapsedTimer timer; timer.start(); while ( it.nextFeature( feature ) ) { context.setFeature( feature ); + + renderCtx.expressionContext().setFeature( feature ); + if ( filter && renderer && !renderer->willRenderFeature( feature, renderCtx ) ) + { + continue; + } + if ( !mapTip.isEmpty() ) { tipString = QgsExpression::replaceExpressionText( mapTip, &context ); @@ -233,6 +260,9 @@ QString QgsMapTip::fetchFeature( QgsMapLayer *layer, QgsPointXY &mapPosition, Qg } } + if ( renderer ) + renderer->stopRender( renderCtx ); + return tipString; }