diff --git a/src/gui/attributetable/qgsattributetablemodel.cpp b/src/gui/attributetable/qgsattributetablemodel.cpp index 7c61243ded3a..aa83e0a0bb04 100644 --- a/src/gui/attributetable/qgsattributetablemodel.cpp +++ b/src/gui/attributetable/qgsattributetablemodel.cpp @@ -1053,9 +1053,13 @@ void QgsAttributeTableModel::prefetchSortData( const QString &expressionString, widgetData = getWidgetData( cache.sortFieldIndex ); } - const QgsFeatureRequest request = QgsFeatureRequest( mFeatureRequest ) - .setFlags( Qgis::FeatureRequestFlag::NoGeometry ) - .setSubsetOfAttributes( cache.sortCacheAttributes ); + QgsFeatureRequest request = QgsFeatureRequest( mFeatureRequest ) + .setSubsetOfAttributes( cache.sortCacheAttributes ); + + // If expression does not need geometry set NoGeometry flag + if ( !cache.sortCacheExpression.needsGeometry() ) + request.setFlags( request.flags() | Qgis::FeatureRequestFlag::NoGeometry ); + QgsFeatureIterator it = mLayerCache->getFeatures( request ); QgsFeature f; @@ -1094,9 +1098,17 @@ QString QgsAttributeTableModel::sortCacheExpression( unsigned long cacheIndex ) void QgsAttributeTableModel::setRequest( const QgsFeatureRequest &request ) { - mFeatureRequest = request; - if ( mLayer && !mLayer->isSpatial() ) - mFeatureRequest.setFlags( mFeatureRequest.flags() | Qgis::FeatureRequestFlag::NoGeometry ); + if ( mFeatureRequest.compare( request ) ) + { + mFeatureRequest = request; + if ( mLayer && !mLayer->isSpatial() ) + mFeatureRequest.setFlags( mFeatureRequest.flags() | Qgis::FeatureRequestFlag::NoGeometry ); + // Prefetch data for sorting, resetting all caches + for ( unsigned long i = 0; i < mSortCaches.size(); ++i ) + { + prefetchSortData( sortCacheExpression( i ), i ); + } + } } const QgsFeatureRequest &QgsAttributeTableModel::request() const diff --git a/src/gui/attributetable/qgsdualview.cpp b/src/gui/attributetable/qgsdualview.cpp index 837e4ffa433a..c2853ac11a35 100644 --- a/src/gui/attributetable/qgsdualview.cpp +++ b/src/gui/attributetable/qgsdualview.cpp @@ -419,6 +419,7 @@ void QgsDualView::setFilterMode( QgsAttributeTableFilterModel::FilterMode filter mFilterModel->disconnectFilterModeConnections(); mMasterModel->setRequest( request ); + whileBlocking( mLayerCache )->setCacheGeometry( needsGeometry ); mMasterModel->loadLayer(); } diff --git a/src/gui/attributetable/qgsdualview.h b/src/gui/attributetable/qgsdualview.h index aebe05fb5292..b9ce8ff7022c 100644 --- a/src/gui/attributetable/qgsdualview.h +++ b/src/gui/attributetable/qgsdualview.h @@ -410,8 +410,8 @@ class GUI_EXPORT QgsDualView : public QStackedWidget, private Ui::QgsDualViewBas void initAttributeForm( const QgsFeature &feature ); /** - * Initializes widgets which depend on the attributes of this layer - */ + * Initializes widgets which depend on the attributes of this layer + */ void columnBoxInit(); void initLayerCache( bool cacheGeometry ); void initModels( QgsMapCanvas *mapCanvas, const QgsFeatureRequest &request, bool loadFeatures );