diff --git a/src/gui/kernel/qhighdpiscaling.cpp b/src/gui/kernel/qhighdpiscaling.cpp index 2fee06c77d695734a94ad58f56b8d212e6a7e252..8dd6c6687d31566be286ae297fa36a40f5f984c6 100644 --- a/src/gui/kernel/qhighdpiscaling.cpp +++ b/src/gui/kernel/qhighdpiscaling.cpp @@ -128,6 +128,7 @@ bool QHighDpiScaling::m_usePixelDensity; // use scale factor from platform plugi bool QHighDpiScaling::m_pixelDensityScalingActive; // pixel density scale factor > 1 bool QHighDpiScaling::m_globalScalingActive; // global scale factor is active bool QHighDpiScaling::m_screenFactorSet; // QHighDpiScaling::setScreenFactor has been used +QDpi QHighDpiScaling::m_logicalDpi; // The scaled logical DPI of the primary screen /* Initializes the QHighDpiScaling global variables. Called before the @@ -159,6 +160,11 @@ void QHighDpiScaling::updateHighDpiScaling() } } m_active = m_globalScalingActive || m_screenFactorSet || m_pixelDensityScalingActive; + + QPlatformScreen *primaryScreen = QGuiApplication::primaryScreen()->handle(); + qreal sf = screenSubfactor(primaryScreen); + QDpi primaryDpi = primaryScreen->logicalDpi(); + m_logicalDpi = QDpi(primaryDpi.first / sf, primaryDpi.second / sf); } /* @@ -246,6 +252,11 @@ qreal QHighDpiScaling::screenSubfactor(const QPlatformScreen *screen) return factor; } +QDpi QHighDpiScaling::logicalDpi() +{ + return m_logicalDpi; +} + qreal QHighDpiScaling::factor(const QScreen *screen) { // Fast path for when scaling in Qt is not used at all. diff --git a/src/gui/kernel/qhighdpiscaling_p.h b/src/gui/kernel/qhighdpiscaling_p.h index d60be8651829112344d280394bab9a88b3a64f8f..5dd9db68c4ec6f35cf22af2896c1daa0fd1d2fc5 100644 --- a/src/gui/kernel/qhighdpiscaling_p.h +++ b/src/gui/kernel/qhighdpiscaling_p.h @@ -57,6 +57,7 @@ Q_DECLARE_LOGGING_CATEGORY(lcScaling); class QScreen; class QPlatformScreen; +typedef QPair<qreal, qreal> QDpi; class Q_GUI_EXPORT QHighDpiScaling { public: @@ -73,6 +74,7 @@ public: static QPoint origin(const QPlatformScreen *platformScreen); static QPoint mapPositionFromNative(const QPoint &pos, const QPlatformScreen *platformScreen); static QPoint mapPositionToNative(const QPoint &pos, const QPlatformScreen *platformScreen); + static QDpi logicalDpi(); private: static qreal screenSubfactor(const QPlatformScreen *screen); @@ -82,6 +84,7 @@ private: static bool m_globalScalingActive; static bool m_pixelDensityScalingActive; static bool m_screenFactorSet; + static QDpi m_logicalDpi; }; // Coordinate system conversion functions: diff --git a/src/gui/kernel/qscreen.cpp b/src/gui/kernel/qscreen.cpp index af88a44957cad698cd88cee3bc04263b8ab4e244..485bb983c0592a6f27e45e969593485f53a934c1 100644 --- a/src/gui/kernel/qscreen.cpp +++ b/src/gui/kernel/qscreen.cpp @@ -235,6 +235,8 @@ qreal QScreen::physicalDotsPerInch() const qreal QScreen::logicalDotsPerInchX() const { Q_D(const QScreen); + if (QHighDpiScaling::isActive()) + return QHighDpiScaling::logicalDpi().first; return d->logicalDpi.first; } @@ -249,6 +251,8 @@ qreal QScreen::logicalDotsPerInchX() const qreal QScreen::logicalDotsPerInchY() const { Q_D(const QScreen); + if (QHighDpiScaling::isActive()) + return QHighDpiScaling::logicalDpi().first; return d->logicalDpi.second; } @@ -267,7 +271,7 @@ qreal QScreen::logicalDotsPerInchY() const qreal QScreen::logicalDotsPerInch() const { Q_D(const QScreen); - QDpi dpi = d->logicalDpi; + QDpi dpi = QHighDpiScaling::isActive() ? QHighDpiScaling::logicalDpi() : d->logicalDpi; return (dpi.first + dpi.second) * qreal(0.5); } diff --git a/src/plugins/platforms/windows/qwindowsscreen.cpp b/src/plugins/platforms/windows/qwindowsscreen.cpp index 7f3bb96503e63df243d35c78d59120d6b4561589..391735a035740eaabf2d20e7dcd7bd7f333260b3 100644 --- a/src/plugins/platforms/windows/qwindowsscreen.cpp +++ b/src/plugins/platforms/windows/qwindowsscreen.cpp @@ -117,14 +117,12 @@ static bool monitorData(HMONITOR hMonitor, QWindowsScreenData *data) HDC hdc = CreateDC(info.szDevice, NULL, NULL, NULL); #endif if (hdc) { - if (!QHighDpiScaling::isActive()) { // Assume 96 DPI to get fonts right when scaling. #ifndef Q_OS_WINCE - const QDpi dpi = monitorDPI(hMonitor); - data->dpi = dpi.first ? dpi : deviceDPI(hdc); + const QDpi dpi = monitorDPI(hMonitor); + data->dpi = dpi.first ? dpi : deviceDPI(hdc); #else - data->dpi = deviceDPI(hdc); + data->dpi = deviceDPI(hdc); #endif - } data->depth = GetDeviceCaps(hdc, BITSPIXEL); data->format = data->depth == 16 ? QImage::Format_RGB16 : QImage::Format_RGB32; data->physicalSizeMM = QSizeF(GetDeviceCaps(hdc, HORZSIZE), GetDeviceCaps(hdc, VERTSIZE));