High DPI scaling
От: Lexerys Украина  
Дата: 04.03.21 10:20
Оценка:
Приветствую!

Есть нативное приложение на Qt (5.6) под винду, и желание выглядеть прилично на мониторах с высоким разрешением (4k).
То есть, весь интерфейс должен выглядеть в соответствии с коэффициентом масштабирования из настроек винды.
Qt начиная с этой версии имеет встроенную поддержку масштабирования.
В итоге, есть 2 способа.

1. Не включать поддержку масштабирования Qt.
Иметь настройку размера интерфейса и строить весь гуй в пикселях, в соответствии со своей настройкой.
Задавать размеры шрифтов в пикселях, размеры контролов, окон и т.п.

2. Включить поддержку масштабирования Qt.

Перед созданием экземпляра QApplication:
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);


Работает, даже начиная с версии 5.14 починили определение scale factor в соответствии с процентами в настройках винды (пока не проверял).
На 5.6 есть проблемы с округлением: 125% = 1, 150% и выше = 2 (увеличение в 2 раза).

Однако, есть нюансы.

1. Система координат для отрисокви 3Д в QGraphicScene, нужно использовать правильные координаты, это решаемо.

2. Места, где используется Pixmap.
Например, для Drag'n'Drop нужно нарисовать кастомную картинку с текстом — после автоматического масштабирования этот текст теряет четкость.

3. QPainter::drawText внутри QGraphicScene.
Несмотря на все заверения из документации о том, что нужно использовать правильные версии методов (с qreal-аргументами), текст все равно нечеткий (такой же, как в пункте 2).
При этом в простом QWidget текст получается четкий.
Если элемент сцены рендерит svg-иконку в paint-методе, после масштабирования она тоже выглядит мутно.
Настройки атрибутов QPainter на четкость текста при масштабировании никак не влияют.

Возможно, в последней версии Qt какие-то из проблем уже решены.
Может, кто сталкивался с этими проблемами и имеет какие-то способы решения?

Спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.