Russian Qt Forum
Ноябрь 24, 2024, 15:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt и Hi DPI мониторы (Retina)  (Прочитано 9245 раз)
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« : Май 22, 2016, 21:59 »

Стал счастливым обладателем монитора с UHD (3840х2160) разрешением. Наконец, мои глаза довольны Улыбающийся.
Дошли руки до своего Qt GUI софта - получил где-то вполне ожидаемые, а где-то не очень проблемы.
Начнем с неожиданных:
1. Если я в приложении делаю setStyleSheet даже в варианте setStyleSheet(QString()) получаю другие размеры шрифтов, А именно вложение 1 - с примененным стилем, вложение 2 - без него. Как видно размеры шрифтов в QStatusBar разные. Хотелось бы иметь одинаковой поведение независимо от текущего DPI.
2. Высота QToolBar в дизайнере (вложение 3) не такая, как в runtime. Тут тоже хотелось бы однозначного соответствия.
Ну и проблема ожидаемая:
3. Проверенные годами иконки 16х16 нечитаемы на Hi DPI. Понятно, что простое решение - использование векторной графики, но тут пока проблема с адекватными сетами. Есть ли вариант как-нибудь в рантайм подменять файлы ресурсов с иконками разного размера в зависимости от текущего DPI?
« Последнее редактирование: Май 23, 2016, 10:02 от xokc » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Май 22, 2016, 23:59 »

Не совсем понятно, как разрешение МОНИТОРА влияет на рендеринг шрифтов в ОКНЕ.
Вы как-то по хитрому пытаетесь их скалировать в зависимости от разрешения?
И по поводу п.3. - ну, чем выше разрешение, тем меньше, и значит, нечитаемей будут иконки, вполне ожидаемо Улыбающийся
Да и все элементы гуя тоже меньше станут.
Если вы замените пиксельные иконки 16х16 на векторные, они растеризируются в те же 16х16, и больше от этого не станут.
Единственный вариант - увеличивать размер иконок в зависимости от текущего разрешения.
Но это имхо стремно - гуй "потечет" в самых неожиданных местах. Кнопки поразлазятся и т.д.
Либо собирайте 2 версии приложения - для "нормального" разрешения и для "повышенного", все равно виджеты подгонять придется...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #2 : Май 23, 2016, 10:02 »

Не совсем понятно, как разрешение МОНИТОРА влияет на рендеринг шрифтов в ОКНЕ.
Вы как-то по хитрому пытаетесь их скалировать в зависимости от разрешения?
Ну так собственно я-то вообще ничего не делаю - "оно всё само" косячит. Абсолютно аналогичное поведение наблюдается и на стандартных примерах.

Если вы замените пиксельные иконки 16х16 на векторные, они растеризируются в те же 16х16, и больше от этого не станут.
Единственный вариант - увеличивать размер иконок в зависимости от текущего разрешения.
Потенциально это не проблема. Например, делаю setPixmap(QIcon("file.svg").pixmap(QSIze(16 * ratio, 16 * ratio)). Осталось правильно ratio посчитать. Но это уже другая ожидаемая проблема - к ней ещё вернусь по результатам текущих исследований.

Но это имхо стремно - гуй "потечет" в самых неожиданных местах. Кнопки поразлазятся и т.д.
Ну файрфокс не "течет", Qt Creator почти не течет, MSVS и офис совсем не текут, да и у меня проблемы вполне решаемые.

Либо собирайте 2 версии приложения - для "нормального" разрешения и для "повышенного", все равно виджеты подгонять придется...
Это уже совсем клиника будет. Разные версии для 32 и 64 бита, разных ОС, а теперь ещё и разных DPI. Смерти моей хотите? Улыбающийся
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #3 : Май 23, 2016, 12:07 »

Какая версия Qt?
Здесь читали про поддержу High DPI? http://doc.qt.io/qt-5/highdpi.html
Возможно установка переменной окружения QT_AUTO_SCREEN_SCALE_FACTOR в 1 может помочь.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #4 : Май 23, 2016, 14:01 »

Какая версия Qt?
Qt 5.6.0, MSVC 2013 x64, Windows 10

Здесь читали про поддержу High DPI? http://doc.qt.io/qt-5/highdpi.html
Безусловно и неоднократно

Возможно установка переменной окружения QT_AUTO_SCREEN_SCALE_FACTOR в 1 может помочь.
С этими переменными ещё, конечно поиграюсь, но первые попытки игр с ними удручают. То шрифты не масштабируются вообще, то они масштабируются дважды - сначала ОС, а потом ещё и Qt. И даже простого режима "увеличения" приложения в 2 раза у меня нормально добиться не получилось. Типа кнопки выросли в 2 раза, а шрифты остались. В общем пока статистики мало.
Записан
vipet
Бывалый
*****
Offline Offline

Сообщений: 452


Просмотр профиля
« Ответ #5 : Май 23, 2016, 14:59 »


Qt Designer - фтопку, UI-код можно (и нужно) писать руками.

Для иконок использовать QIcon - там задаются несколько изображения в разных размерах, и в зависимости от dpi указывать разные toolBar->setIconSize(QSize(..., ...))
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #6 : Май 23, 2016, 16:34 »

В приложении на QML(Qt 5.5.1) у меня проблема решилась установкой данной переменной окружения:
Код:
qputenv("QT_DEVICE_PIXEL_RATIO", QByteArray("auto"));

Проблема была только на Windows, на Mac масштабировалось все самое. Иконки все SVG.

Цитировать
Есть ли вариант как-нибудь в рантайм подменять файлы ресурсов с иконками разного размера в зависимости от текущего DPI?
Можно, но все вручную, в зависимости от QScreen::devicePixelRatio
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #7 : Май 23, 2016, 16:42 »

В приложении на QML(Qt 5.5.1) у меня проблема решилась установкой данной переменной окружения:
Код:
qputenv("QT_DEVICE_PIXEL_RATIO", QByteArray("auto"));
This variable is deprecated in Qt 5.6.

Можно, но все вручную, в зависимости от QScreen::devicePixelRatio
Судя по http://blog.qt.io/blog/2013/04/25/retina-display-support-for-mac-os-ios-and-x11/ в iOS все решается автоматически при наличии ресурсов с суффиксом @2x. Налиличие подобного хака в винде из коробки тоже облегчило бы жизнь.
« Последнее редактирование: Май 23, 2016, 20:44 от xokc » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #8 : Июнь 08, 2016, 10:10 »

Qt Designer - фтопку

Почему? Улыбающийся

UI-код можно (и нужно) писать руками.

Зачем, если есть дизайнер ? Улыбающийся
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #9 : Февраль 05, 2017, 14:30 »

Одно существенное улучшение в 5.8.0 для десктопа я таки вижу. Режим масштабирования 2х по виндой теперь работает практически безупречно. "Практически" потому, что после ухода компа в сон и пробуждения, приложение (или часть его элементов, например popup menu) вдруг ставятся мелкими. Лечится разворотом в полноэкранный режим.
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #10 : Февраль 06, 2017, 11:14 »

Зачем, если есть дизайнер ? Улыбающийся
Я этим тоже как то переболел, вначале рисуешь в дизайне, потом когда появились динамически изменяемые элементы весь интерфейс начал создавать только через код(эффект - почувствуй себя "крутым" программистом, хотя долго и тупо).
Теперь использую дизайнер для статического интерфейса и кодом шлифую если есть динамический интерфейс.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 23.