diff --git a/src/gui/attributetable/qgsattributetablemodel.cpp b/src/gui/attributetable/qgsattributetablemodel.cpp index a7500cf0712..c3c20cad720 100644 --- a/src/gui/attributetable/qgsattributetablemodel.cpp +++ b/src/gui/attributetable/qgsattributetablemodel.cpp @@ -1053,9 +1053,7 @@ void QgsAttributeTableModel::prefetchSortData( const QString &expressionString, widgetData = getWidgetData( cache.sortFieldIndex ); } - const QgsFeatureRequest request = QgsFeatureRequest( mFeatureRequest ) - .setFlags( cache.sortCacheExpression.needsGeometry() ? Qgis::FeatureRequestFlag::NoFlags : Qgis::FeatureRequestFlag::NoGeometry ) - .setSubsetOfAttributes( cache.sortCacheAttributes ); + const QgsFeatureRequest request = QgsFeatureRequest( mFeatureRequest ).setFlags( cache.sortCacheExpression.needsGeometry() ? Qgis::FeatureRequestFlag::NoFlags : Qgis::FeatureRequestFlag::NoGeometry ).setSubsetOfAttributes( cache.sortCacheAttributes ); QgsFeatureIterator it = mLayerCache->getFeatures( request ); diff --git a/src/gui/attributetable/qgsdualview.cpp b/src/gui/attributetable/qgsdualview.cpp index 837e4ffa433..de61c649218 100644 --- a/src/gui/attributetable/qgsdualview.cpp +++ b/src/gui/attributetable/qgsdualview.cpp @@ -336,16 +336,13 @@ void QgsDualView::setFilterMode( QgsAttributeTableFilterModel::FilterMode filter // create an empty form to find out if it needs geometry or not const QgsAttributeForm emptyForm( mLayer, QgsFeature(), mEditorContext ); - const bool needsGeometry = ( filterMode == QgsAttributeTableFilterModel::ShowVisible ) || emptyForm.needsGeometry(); + const bool needsGeometry = ( filterMode == QgsAttributeTableFilterModel::ShowVisible ) || emptyForm.needsGeometry() || QgsExpression( mConfig.sortExpression() ).needsGeometry(); const bool requiresTableReload = ( request.filterType() != Qgis::Qgis::FeatureRequestFilterType::NoFilter || request.spatialFilterType() != Qgis::SpatialFilterType::NoFilter ) // previous request was subset || ( needsGeometry && request.flags() & Qgis::FeatureRequestFlag::NoGeometry ) // no geometry for last request || ( mMasterModel->rowCount() == 0 ); // no features - if ( !needsGeometry ) - request.setFlags( request.flags() | Qgis::FeatureRequestFlag::NoGeometry ); - else - request.setFlags( request.flags() & ~( static_cast< int >( Qgis::FeatureRequestFlag::NoGeometry ) ) ); + request.setFlags( request.flags().setFlag( Qgis::FeatureRequestFlag::NoGeometry, !needsGeometry ) ); request.setFilterFids( QgsFeatureIds() ); request.setFilterRect( QgsRectangle() ); request.disableFilter(); @@ -1135,7 +1132,6 @@ bool QgsDualView::modifySort() config.setSortExpression( QString() ); } - setAttributeTableConfig( config ); return true; } else @@ -1334,7 +1330,10 @@ void QgsDualView::setAttributeTableConfig( const QgsAttributeTableConfig &config mFilterModel->setAttributeTableConfig( mConfig ); mTableView->setAttributeTableConfig( mConfig ); const QgsAttributeList attributes { requiredAttributes( mLayer ) }; - QgsFeatureRequest request { mMasterModel->request() }; + // Determine if the sort expression needs geometry + const bool newSortExpressionNeedsGeometry { QgsExpression( config.sortExpression() ).needsGeometry() }; + QgsFeatureRequest request = mMasterModel->request(); + request.setFlags( request.flags().setFlag( Qgis::FeatureRequestFlag::NoGeometry, !newSortExpressionNeedsGeometry ) ); request.setSubsetOfAttributes( attributes ); mMasterModel->setRequest( request ); mLayerCache->setCacheSubsetOfAttributes( attributes ); @@ -1342,6 +1341,7 @@ void QgsDualView::setAttributeTableConfig( const QgsAttributeTableConfig &config void QgsDualView::setSortExpression( const QString &sortExpression, Qt::SortOrder sortOrder ) { + if ( sortExpression.isNull() ) mFilterModel->sort( -1 ); else