Make layout scalebar "map units" choice more user-friendly

Explicitly list the actual map units in the item text,
eg "Map Units (meters)", so that users know exactly what unit
the scalebar is using.

Refs https://www.reddit.com/r/QGIS/comments/1nsgbhz/why_is_my_scale_bar_not_working/
This commit is contained in:
Nyall Dawson 2025-09-29 13:56:48 +10:00
parent e233e48826
commit bae5d99f67
2 changed files with 23 additions and 1 deletions

View File

@ -118,7 +118,8 @@ QgsLayoutScaleBarWidget::QgsLayoutScaleBarWidget( QgsLayoutItemScaleBar *scaleBa
mAlignmentComboBox->setAvailableAlignments( Qt::AlignLeft | Qt::AlignHCenter | Qt::AlignRight ); mAlignmentComboBox->setAvailableAlignments( Qt::AlignLeft | Qt::AlignHCenter | Qt::AlignRight );
//units combo box //units combo box
mUnitsComboBox->addItem( tr( "Map units" ), static_cast<int>( Qgis::DistanceUnit::Unknown ) );
mUnitsComboBox->addItem( linkedMapUnitsString( scaleBar ), static_cast<int>( Qgis::DistanceUnit::Unknown ) );
mUnitsComboBox->addItem( tr( "Meters" ), static_cast<int>( Qgis::DistanceUnit::Meters ) ); mUnitsComboBox->addItem( tr( "Meters" ), static_cast<int>( Qgis::DistanceUnit::Meters ) );
mUnitsComboBox->addItem( tr( "Kilometers" ), static_cast<int>( Qgis::DistanceUnit::Kilometers ) ); mUnitsComboBox->addItem( tr( "Kilometers" ), static_cast<int>( Qgis::DistanceUnit::Kilometers ) );
mUnitsComboBox->addItem( tr( "Feet" ), static_cast<int>( Qgis::DistanceUnit::Feet ) ); mUnitsComboBox->addItem( tr( "Feet" ), static_cast<int>( Qgis::DistanceUnit::Feet ) );
@ -823,6 +824,8 @@ void QgsLayoutScaleBarWidget::mapChanged( QgsLayoutItem *item )
mScalebar->update(); mScalebar->update();
connectUpdateSignal(); connectUpdateSignal();
mScalebar->endCommand(); mScalebar->endCommand();
mUnitsComboBox->setItemText( mUnitsComboBox->findData( static_cast<int>( Qgis::DistanceUnit::Unknown ) ), linkedMapUnitsString( mScalebar ) );
} }
void QgsLayoutScaleBarWidget::mMinWidthSpinBox_valueChanged( double ) void QgsLayoutScaleBarWidget::mMinWidthSpinBox_valueChanged( double )
@ -866,3 +869,20 @@ void QgsLayoutScaleBarWidget::populateDataDefinedButtons()
updateDataDefinedButton( mSubdivisionHeightDDBtn ); updateDataDefinedButton( mSubdivisionHeightDDBtn );
updateDataDefinedButton( mRightSegmentSubdivisionsDDBtn ); updateDataDefinedButton( mRightSegmentSubdivisionsDDBtn );
} }
QString QgsLayoutScaleBarWidget::linkedMapUnitsString( QgsLayoutItemScaleBar *scalebar )
{
QString mapUnit;
if ( scalebar )
{
if ( QgsLayoutItemMap *map = scalebar->linkedMap() )
{
const Qgis::DistanceUnit mapCrsUnits = map->crs().mapUnits();
if ( mapCrsUnits != Qgis::DistanceUnit::Unknown )
{
mapUnit = QgsUnitTypes::toString( mapCrsUnits );
}
}
}
return mapUnit.isEmpty() ? tr( "Map Units" ) : tr( "Map Units (%1)" ).arg( mapUnit );
}

View File

@ -103,6 +103,8 @@ class GUI_EXPORT QgsLayoutScaleBarWidget : public QgsLayoutItemBaseWidget, publi
void connectUpdateSignal(); void connectUpdateSignal();
void disconnectUpdateSignal(); void disconnectUpdateSignal();
void populateDataDefinedButtons(); void populateDataDefinedButtons();
static QString linkedMapUnitsString( QgsLayoutItemScaleBar *scalebar );
}; };
#endif //QGSLAYOUTSCALEBARWIDGET_H #endif //QGSLAYOUTSCALEBARWIDGET_H