| /**************************************************************************** |
| ** |
| ** Copyright (C) 2016 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the documentation of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:FDL$ |
| ** Commercial License Usage |
| ** Licensees holding valid commercial Qt licenses may use this file in |
| ** accordance with the commercial license agreement provided with the |
| ** Software or, alternatively, in accordance with the terms contained in |
| ** a written agreement between you and The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** GNU Free Documentation License Usage |
| ** Alternatively, this file may be used under the terms of the GNU Free |
| ** Documentation License version 1.3 as published by the Free Software |
| ** Foundation and appearing in the file included in the packaging of |
| ** this file. Please review the following information to ensure |
| ** the GNU Free Documentation License version 1.3 requirements |
| ** will be met: https://www.gnu.org/licenses/fdl-1.3.html. |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| /*! |
| \page highdpi.html |
| \title High DPI Displays |
| \brief Describes the concepts in high DPI displays. |
| |
| High DPI displays have increased pixel density, compared to standard DPI displays. |
| |
| Pixel density is measured in Dots per Inch (DPI) or Pixels per Inch (PPI), and is determined by |
| the number of display pixels and their size. Consequently, the number of pixels alone isn't |
| enough to determine if a display falls into the high-DPI category. |
| |
| A 4K monitor has a fixed number of pixels (~8M), however its DPI varies between 185 (23 inches) |
| and 110 (40 inches). The former is around twice the standard 96 DPI desktop resolution; the |
| latter barely exceeds this resolution. |
| |
| \section2 Challenges with High DPI |
| |
| High DPI displays bring about some challenges for existing applications: |
| |
| \list |
| \li \b{Applications using UI designs with fixed coordinates look small} |
| \br The combination of specifying font size in points and other sizes in pixels is |
| particularly problematic because points are independent from the monitor's resolution. |
| For example, suppose we have a frame of 40x20 pixels around the text "hello". If we use |
| a 12pt font, it would look correct on low resolution monitors. But, on high DPI |
| monitors, the frame would be too small, resulting in the text being clipped. |
| |
| \li \b{Applications must adapt to situations where users have multiple displays with |
| varying resolutions} |
| \br For example, a user might use a 4K monitor for the document window of an image |
| editor but a low resolution monitor for the tool box. |
| \endlist |
| |
| Traditionally, to support high DPI, Qt scales fonts automatically and provides a DPI value |
| that application code can use to scale the rest of the UI. |
| |
| \section2 High DPI Support on a System Level |
| |
| Qt supports a high DPI mode where the main coordinate system is virtualized and made independent |
| from the display pixel density. Some operating systems, like \macOS and iOS implement this mode. |
| Additionally, if an operating system doesn't support this mode, Qt has an implementation to |
| fallback on. |
| |
| Now, geometry is specified in device independent pixels. This includes widget and item geometry, |
| event geometry, desktop, window and screen geometry, as well as animation velocities. The output |
| is rendered in device pixels, which corresponds to the display resolution. The \e devicePixelRatio |
| is the ratio between the device independent pixels and the device pixel coordinate system. |
| |
| Typically, most applications work with device independent pixels; except for OpenGL and code for |
| raster graphics. |
| |
| \section2 Operating System Support |
| |
| The Qt-supported operating systems offer the following for high DPI displays: |
| |
| \section3 \macos and iOS |
| |
| The Apple platforms implement scaling and coordinate system virtualization in the operating |
| system. Normally, no special configuration is required. |
| |
| On \macos, high-DPI support is enabled by settings in the \c{Info.plist} file; so make sure |
| these settings are present. |
| |
| \code |
| <key>NSPrincipalClass</key> |
| <string>NSApplication</string> |
| <key>NSHighResolutionCapable</key> |
| <string>True</string> |
| \endcode |
| |
| Newer versions of qmake will generate an \c{Info.plist} file with the NSPrincipalClass key; |
| this is sufficient since NSHighResolutionCapable is true by default. |
| |
| \note Both \macos and iOS may apply further virtualization, such that device pixels no longer |
| correspond to display pixels 1:1. This happens on the iPhone 6+ and on \macos configured with |
| "display scaling" enabled. |
| |
| \section3 Microsoft Windows |
| |
| \b Scaling |
| |
| Users choose a scaling factor from the \uicontrol{Control Panel} or via the context menu. This |
| works by making the functions for querying the system metrics return different values for |
| standard font sizes, sizes of window borders, and so on. It doesn't perform any actual scaling. |
| |
| \b DPI Awareness |
| |
| An application on Windows can assume one of the following levels of "DPI Awareness": |
| |
| \table |
| \header |
| \li DPI Awareness Level |
| \li Meaning |
| |
| \row |
| \li DPI Unaware |
| \li This level was introduced in Windows Vista. To the application, Windows pretends |
| as if it's running on a standard display of 96 DPI of 1920x1080 and scales the |
| application accordingly. It's intended to accommodate older applications designed |
| for low DPI displays. This type of scaling may result in some artifacts. |
| |
| \row |
| \li System-DPI Aware |
| \li This level was introduced in Windows Vista. It differs from |
| \e{Per-Monitor DPI Aware} only when multiple monitors are connected. Windows |
| calculates a scaling that's suitable for all monitors connected. |
| |
| \row |
| \li Per-Monitor DPI Aware |
| \li This level was introduced in Windows 8.1. Windows does not perform any scaling at |
| all. |
| \endtable |
| |
| By default, Qt applications are set to \e{Per-Monitor DPI Aware} on Windows 8.1 or |
| \e{System-DPI Aware} on older Windows versions. As of Qt 5.4, this level can be specified via |
| a parameter to the platform plugin: |
| |
| \code |
| <application> -platform windows:dpiawareness=0,1,2 |
| \endcode |
| |
| For more information, see \l{Using qt.conf}. |
| |
| \section2 High DPI Support in Qt |
| |
| Qt provides the following ways for you to handle high DPI support in your application. |
| |
| \list |
| \li The ability to provide pixmaps or artwork for high resolution. For more details, |
| see \l{Drawing High Resolution Versions of Pixmaps and Images}. |
| |
| \li Qt 5.6 supports cross-platform high-DPI scaling for legacy applications, similar to |
| the scaling done natively in \macos. This allows applications written for low DPI |
| screens to run unchanged on high DPI devices. This feature is opt-in, and can be |
| enabled using the following environment variables: |
| \list |
| \li \c QT_AUTO_SCREEN_SCALE_FACTOR [boolean] enables automatic scaling, |
| based on the monitor's pixel density. This won't change the size of point-sized |
| fonts, since point is a physical measurement unit. Multiple screens may get |
| different scale factors. |
| |
| \li \c QT_SCALE_FACTOR [numeric] defines a global scale factor for the whole |
| application, including point-sized fonts. |
| |
| \li \c QT_SCREEN_SCALE_FACTORS [list] specifies scale factors for each screen. |
| This won't change the size of point-sized fonts. The environment variable is |
| mainly useful for debugging, or to work around monitors with wrong |
| \l {https://en.wikipedia.org/wiki/Extended_Display_Identification_Data} |
| {EDID information}(Extended Display Identification Data). |
| |
| The format can either be a semicolon-separated list of scale factors in the same |
| order as QGuiApplication::screens(), or a semicolon-separated list of \c name=value |
| pairs, where \c name is the same as QScreen::name(). |
| \endlist |
| |
| While the \macOS style fully supports high-DPI, the Windows desktop style currently has |
| some limitations with certain scale factors. In these cases, consider using the Fusion |
| style instead, which supports high-DPI in all cases. |
| |
| \note Non-integer scale factors may cause significant scaling/painting artifacts. |
| |
| \li The \c Qt::AA_EnableHighDpiScaling application attribute, introduced in Qt 5.6, |
| enables automatic scaling based on the monitor's pixel density. |
| |
| \li The \c Qt::AA_DisableHighDpiScaling application attribute, introduced in Qt 5.6, |
| turns off all scaling. This is intended for applications that require actual window |
| system coordinates, regardless of environment variables. This attribute takes priority |
| over Qt::AA_EnableHighDpiScaling. |
| |
| \li The QT_ENABLE_HIGHDPI_SCALING environment variable, introduced in Qt 5.14, |
| enables automatic scaling based on the pixel density of the monitor. Replaces |
| QT_AUTO_SCREEN_SCALE_FACTOR. |
| |
| \li The QT_SCALE_FACTOR_ROUNDING_POLICY environment variable and |
| QGuiApplication::highDpiScaleFactorRoundingPolicy API, introduced in Qt 5.14, |
| makes it possible to control if and how the device pixel ratio should be rounded |
| to the nearest integer. This is relevant for configurations like Windows at |
| 150% scale. Possible values are \c{Round}, \c{Ceil}, \c{Floor}, \c{RoundPreferFloor}, |
| \c{PassThrough}. See the Qt::HighDpiScaleFactorRoundingPolicy enum documentation |
| for a full description of the options. |
| |
| \li In Qt 5.4, there was an experimental implementation of high DPI scaling introduced via |
| the \c QT_DEVICE_PIXEL_RATIO environment variable, that you could set to a numerical |
| scale factor or \c auto. This variable was deprecated in Qt 5.6. |
| \endlist |
| |
| \section2 Migrate Existing Applications |
| |
| To get an application designed for low DPI values running on high resolution monitors quickly, |
| consider one of the following: |
| |
| \list |
| \li let the application run as \e{DPI Unaware} on Windows |
| \li set the \c QT_AUTO_SCREEN_SCALE_FACTOR environment variable to \c 1. |
| \endlist |
| |
| However, these options may result in some scaling or painting artifacts. |
| |
| In the long term, the application should be adapted to run unmodified: |
| |
| \list |
| \li Always use the qreal versions of the QPainter drawing API. |
| \li Size windows and dialogs in relation to the corresponding screen size. |
| \li Replace hard-coded sizes in layouts and drawing code with values calculated from font |
| metrics or screen size. |
| \endlist |
| |
| \section2 Glossary Of High DPI Terms |
| |
| \table |
| \header |
| \li Term |
| \li Definition |
| |
| \row |
| \li Device Independent Pixels |
| \li The pixels that an application uses (user space), subject to scaling by the operating |
| system or Qt. |
| |
| \row |
| \li Device Pixels |
| \li The display device's pixels. |
| |
| \row |
| \li Device Pixel Ratio |
| \li The scale factor that either the operating system or Qt applies. |
| |
| \row |
| \li Logical DPI |
| \li The resolution used to convert font sizes defined in points to font sizes in pixels. |
| The standard values are 96, 128, ... 192. |
| |
| \row |
| \li Physical DPI |
| \li The physical resolution obtained by dividing the size of the monitor by the number |
| of pixels. |
| \row |
| \li User Space |
| \li The coordinate space that an application uses in Device Independent Pixels. |
| \endtable |
| */ |