summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/global/qnamespace.h3
-rw-r--r--src/corelib/global/qnamespace.qdoc16
-rw-r--r--src/gui/kernel/qhighdpiscaling.cpp36
3 files changed, 40 insertions, 15 deletions
diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h
index de8a17fa51..c4f5415a01 100644
--- a/src/corelib/global/qnamespace.h
+++ b/src/corelib/global/qnamespace.h
@@ -496,7 +496,8 @@ public:
AA_UseSoftwareOpenGL = 17,
AA_ShareOpenGLContexts = 18,
AA_SetPalette = 19,
- AA_NoHighDpiScaling = 20,
+ AA_EnableHighDpiScaling = 20,
+ AA_DisableHighDpiScaling = 21,
// Add new attributes before this line
AA_AttributeCount
diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc
index 443eae5a11..e789daafbd 100644
--- a/src/corelib/global/qnamespace.qdoc
+++ b/src/corelib/global/qnamespace.qdoc
@@ -200,10 +200,22 @@
\value AA_SetPalette Indicates whether a palette was explicitly set on the
QApplication/QGuiApplication. This value has been added in Qt 5.5.
- \value AA_NoHighDpiScaling Disables all high-DPI scaling in Qt, exposing window
+ \value AA_EnableHighDpiScaling. Enables high-DPI scaling in Qt on supported
+ platforms (see also \l{High DPI Displays}). Supported platforms are
+ X11, Windows and Android. Enabling makes Qt scale the main (device
+ independent) coordinate system according to display scale factors
+ provided by the operating system. This corresponds to setting the
+ QT_AUTO_SCREEN_SCALE_FACTOR environment variable to 1. This value
+ has been added in Qt 5.6. This attribute must be set before
+ Q(Gui)Application is constructed.
+
+ \value AA_DisableHighDpiScaling Disables high-DPI scaling in Qt, exposing window
system coordinates. Note that the window system may do its own scaling,
so this does not guarantee that QPaintDevice::devicePixelRatio() will
- be equal to 1. This value has been added in Qt 5.6.
+ be equal to 1. In addition, scale factors set by QT_SCALE_FACTOR will not
+ be affected. This corresponds to setting the QT_AUTO_SCREEN_SCALE_FACTOR
+ environment variable to 0. This value has been added in Qt 5.6. This
+ attribute must be set before Q(Gui)Application is constructed.
The following values are obsolete:
diff --git a/src/gui/kernel/qhighdpiscaling.cpp b/src/gui/kernel/qhighdpiscaling.cpp
index daba9f94a1..a002b8c48d 100644
--- a/src/gui/kernel/qhighdpiscaling.cpp
+++ b/src/gui/kernel/qhighdpiscaling.cpp
@@ -49,7 +49,7 @@ static const char scaleFactorEnvVar[] = "QT_SCALE_FACTOR";
static const char autoScreenEnvVar[] = "QT_AUTO_SCREEN_SCALE_FACTOR";
static const char screenFactorsEnvVar[] = "QT_SCREEN_SCALE_FACTORS";
-static inline qreal initialScaleFactor()
+static inline qreal initialGlobalScaleFactor()
{
qreal result = 1;
@@ -134,19 +134,31 @@ QDpi QHighDpiScaling::m_logicalDpi = QDpi(-1,-1); // The scaled logical DPI of t
Initializes the QHighDpiScaling global variables. Called before the
platform plugin is created.
*/
-void QHighDpiScaling::initHighDpiScaling()
+
+static inline bool usePixelDensity()
{
- if (QCoreApplication::testAttribute(Qt::AA_NoHighDpiScaling)) {
- m_factor = 1;
- m_active = false;
- return;
- }
- m_factor = initialScaleFactor();
- bool usePlatformPluginPixelDensity = qEnvironmentVariableIsSet(autoScreenEnvVar)
- || qgetenv(legacyDevicePixelEnvVar).toLower() == "auto";
+ // Determine if we should set a scale factor based on the pixel density
+ // reported by the platform plugin. There are several enablers and several
+ // disablers. A single disable may veto all other enablers.
+ if (QCoreApplication::testAttribute(Qt::AA_DisableHighDpiScaling))
+ return false;
+ bool screenEnvValueOk;
+ const int screenEnvValue = qEnvironmentVariableIntValue(autoScreenEnvVar, &screenEnvValueOk);
+ if (screenEnvValueOk && screenEnvValue < 1)
+ return false;
+ return QCoreApplication::testAttribute(Qt::AA_EnableHighDpiScaling)
+ || (screenEnvValueOk && screenEnvValue > 0)
+ || (qEnvironmentVariableIsSet(legacyDevicePixelEnvVar) && qgetenv(legacyDevicePixelEnvVar).toLower() == "auto");
+}
+void QHighDpiScaling::initHighDpiScaling()
+{
+ // Determine if there is a global scale factor set.
+ m_factor = initialGlobalScaleFactor();
m_globalScalingActive = !qFuzzyCompare(m_factor, qreal(1));
- m_usePixelDensity = usePlatformPluginPixelDensity;
+
+ m_usePixelDensity = usePixelDensity();
+
m_pixelDensityScalingActive = false; //set in updateHighDpiScaling below
// we update m_active in updateHighDpiScaling, but while we create the
@@ -156,7 +168,7 @@ void QHighDpiScaling::initHighDpiScaling()
void QHighDpiScaling::updateHighDpiScaling()
{
- if (QCoreApplication::testAttribute(Qt::AA_NoHighDpiScaling))
+ if (QCoreApplication::testAttribute(Qt::AA_DisableHighDpiScaling))
return;
if (m_usePixelDensity && !m_pixelDensityScalingActive) {