Автоматическое масштабирование приложения на платформе Windows с высоким разрешением?

Я пишу приложение Qt, которое должно работать в Windows с высоким разрешением (192 dpi вместо 96 dpi).

К сожалению, фреймворк Qt еще не поддерживает высокое разрешение (по крайней мере, в Windows), поэтому мое приложение и все его элементы выглядят вдвое меньше, чем должны.

Есть ли способ принудительно/симулировать автоматическое масштабирование таких приложений в Windows?


person Robin Lobel    schedule 23.06.2014    source источник


Ответы (5)


Приложения, использующие фиксированные координаты и размеры, будут выглядеть маленькими при высоком разрешении DPI. Хотя даже при использовании макетов возникают некоторые проблемы, связанные с размерами и полями элементов, шрифтов. К счастью, начиная с Qt 5.4 существует поддержка дисплеев с высоким разрешением, так как было много исправлений проблем с высоким разрешением< /а>.

Приложение в Windows может иметь один из следующих уровней «осведомленности о DPI» (из документации Qt):

  • DPI Unaware: этот уровень был введен в Windows-Vista. Windows будет притворяться приложению, что оно работает на стандартном дисплее с разрешением 96 точек на дюйм и разрешением 1920x1080, и соответствующим образом масштабировать приложение. Он предназначен для поддержки старых приложений, предназначенных для дисплеев с низким разрешением. Некоторые артефакты могут быть результатом такого масштабирования.
  • System-DPI Aware: этот уровень был введен в Windows-Vista. Он отличается от Per-Monitor DPI Aware только при подключении нескольких мониторов. Windows рассчитает масштабирование, подходящее для всех подключенных мониторов.
  • Per-Monitor DPI Aware: этот уровень был представлен в Windows 8.1. Windows вообще не выполняет никакого масштабирования.

Также говорится, что:

Приложения Qt по умолчанию поддерживают DPI для каждого монитора в Windows 8.1 или поддерживают системный DPI в более старых версиях Windows. Начиная с Qt 5.4, уровень можно указать, передав параметр плагину платформы (см. Использование qt.conf):

<application> -platform windows:dpiawareness=0,1,2

Дополнительную информацию можно прочитать здесь.

В целом, чтобы иметь хороший пользовательский интерфейс на дисплеях с высоким разрешением, учтите следующее:

  • Используйте последнюю версию Qt
  • Используйте макеты и избегайте фиксированных размеров (если только вы не рассчитываете коэффициенты масштабирования самостоятельно)
  • Сделайте соответствующие настройки, связанные с DPI, в зависимости от потребностей вашего приложения, например, установите атрибут Qt::AA_UseHighDpiPixmaps, если вы работаете с QPainter и растровыми изображениями, или рассчитайте коэффициент масштабирования для настройки определенных размеров элементов в особых ситуациях.
person Nejat    schedule 19.02.2015

Qt полностью поддерживает мониторы с высоким разрешением, начиная с Qt 5.6, через атрибут или переменную среды (за исключением OS X, где поддержка является родной). Для метода атрибута используйте:

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); // DPI support

    QApplication app(argc, argv);   
    return app.exec();
}

или установите системную переменную среды:

QT_AUTO_SCREEN_SCALE_FACTOR=1

Я протестировал оба метода в Windows 10 с монитором Surfacebook с высоким разрешением, и результаты масштабируются должным образом, как и ожидалось.

person Nicolas Holthaus    schedule 17.03.2016
comment
Ничего не изменил. - person Sebi2020; 09.12.2019

Вот самый быстрый способ решить проблему в Windows.

Рядом с исполняемым файлом создайте файл qt.conf (если его еще нет) и добавьте следующее:

[Platforms]
WindowsArguments = dpiawareness=0

Окно будет выглядеть размытым при увеличении. Большим преимуществом этого решения является то, что масштабированием занимается Windows, а не Qt. Поэтому появление артефактов сведено к минимуму. Кроме того, это может относиться к уже распространенному приложению, поскольку оно не требует перестроения.

Конечно, это не самый приятный результат, но самый быстрый способ избавить вас от неприятностей в краткосрочной перспективе, позволяя разработать «настоящую» версию с поддержкой DPI без давления.

person DavGin    schedule 16.05.2018

Я использую Qt 4.8. Во-первых, вы должны использовать макеты. Моя цель состояла в том, чтобы запретить пользователю изменять размер диалогов, форм и т.д.

Я добился правильного отображения результатов на разных DPI, поместив этот код в конструктор диалога:

adjustSize();
setFixedSize(size());

Первая строка adjustSize() регулирует размер диалога в соответствии с его содержимым. Вторая строка setFixedSize(size()) исправляет размер диалога после настройки его размера в соответствии с содержимым и запрещает пользователям изменять его размер. Вам не нужно устанавливать политику размера.

person maly216    schedule 15.04.2017

Я использую Qt 4.8.7. Это мой код.

static float dpiX = (float)0;
inline int autoDpiSize(int inSize)
{
    if (dpiX == (float)0)
    {
        HDC screen = GetDC(0);
        dpiX = static_cast<float >(GetDeviceCaps(screen, LOGPIXELSX)) / 96.0;
        ReleaseDC(0, screen);
    }
    return dpiX * inSize;
}
someWidget->setFixedHeight(autoDpiSize(30));
person Chen    schedule 05.06.2020
comment
спасибо за совет, но могу я спросить, почему вы все еще используете 4.8 в 2020 году? Это почти десятилетие. - person Robin Lobel; 06.06.2020
comment
потому что у нас старая программа и она должна быть совместима с XP, даже 2000. - person Chen; 08.06.2020