diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp index 2a5b615d38f..e7504658f68 100644 --- a/src/app/qgisapp.cpp +++ b/src/app/qgisapp.cpp @@ -50,6 +50,7 @@ #include #include #include +#include #include #include #include @@ -1033,8 +1034,20 @@ QgisApp::QgisApp( QSplashScreen *splash, bool restorePlugins, bool skipVersionCh } // Set icon size of toolbars - int size = settings.value( QStringLiteral( "IconSize" ), QGIS_ICON_SIZE ).toInt(); - setIconSizes( size ); + if ( settings.contains( QStringLiteral( "IconSize" ) ) ) + { + int size = settings.value( QStringLiteral( "IconSize" ) ).toInt(); + if ( size < 16 ) + size = QGIS_ICON_SIZE; + setIconSizes( size ); + } + else + { + // first run, guess a good icon size + int size = chooseReasonableDefaultIconSize(); + settings.setValue( QStringLiteral( "IconSize" ), size ); + setIconSizes( size ); + } mSplash->showMessage( tr( "Initializing file filters" ), Qt::AlignHCenter | Qt::AlignBottom ); qApp->processEvents(); @@ -1729,6 +1742,31 @@ QgsCoordinateReferenceSystem QgisApp::defaultCrsForNewLayers() const return defaultCrs; } +int QgisApp::chooseReasonableDefaultIconSize() const +{ + QScreen *screen = QApplication::screens().at( 0 ); + if ( screen->physicalDotsPerInch() < 115 ) + { + // no hidpi screen, use default size + return QGIS_ICON_SIZE; + } + else + { + double size = fontMetrics().width( QStringLiteral( "XXX" ) ); + if ( size < 24 ) + return 16; + else if ( size < 32 ) + return 24; + else if ( size < 48 ) + return 32; + else if ( size < 64 ) + return 48; + else + return 64; + } + +} + void QgisApp::readSettings() { QgsSettings settings; diff --git a/src/app/qgisapp.h b/src/app/qgisapp.h index 08e316be521..c7642030477 100644 --- a/src/app/qgisapp.h +++ b/src/app/qgisapp.h @@ -1688,6 +1688,9 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow QgsCoordinateReferenceSystem defaultCrsForNewLayers() const; + //! Attempts to choose a reasonable default icon size based on the window's screen DPI + int chooseReasonableDefaultIconSize() const; + QgisAppStyleSheet *mStyleSheetBuilder = nullptr; // actions for menus and toolbars -----------------