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

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

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

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

Ответы

Ответ 1

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

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

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

Также он утверждает, что:

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

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

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

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

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

Ответ 2

Qt полностью поддерживает высокие DPI-мониторы от 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 с помощью монитора с надписью с высоким разрешением DPI, и результаты масштабируются должным образом, как ожидалось.

Ответ 3

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

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

adjustSize();
setFixedSize(size());

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