LINUX.ORG.RU

Qt и hidpi

 ,


1

2

Не могу нагуглить ответы на несколько вопросов.

Начнем с того, что у меня монитор не хайдпи, поэтому проверить сам я не могу. Да и, в зависимости от ВМ и ДЕ оно будет вести себя по разному. И, хотя, частично на результаты теста можно будет полагаться, но на 100% уверенным быть нельзя, что всё это будет выглядеть и у других так же как у тебя.

Все вопросы касаются только Qt, мы говорим о Qt!!!

Итак:

1) Растягиваются ли под хайдпи виджеты, которым указан фиксированый размер в писелях? Если нет, то почему? Как это фиксить? Опираться на пиксельметрик фонта?

2) Растягиваются ли паттерны бекграунда для QBrush? Если нет, то как это обходить?

3) Какого размера должны быть иконки кнопок тулбара (да, свой набор) чтобы не быть мыльными при хайдпи? Сейчас они вообще 24х24 и хватает. Где-то вычитал, что 128х128 достаточно, но там речь шла про вендец. Так ли это для остального?

4) Что делать с масками пиксмапов при перекрашивании иконок под тему ДЕ? Полагаю они будут фейлится и порождать мусор, когда их растянет под хайдпи. Они и сейчас это делают на ганицах с прозрачностью:

// в конструкторе
pixmap(iconPath),
mask(pixmap.createMaskFromColor(Qt::black, Qt::MaskOutColor))

// где-то ниже по событию QEvent::StyleChange
pixmap.fill(palette().color(QPalette::Disabled, QPalette::ButtonText));
pixmap.setMask(mask);
setIcon(pixmap);

5) Что насчет стайлшитов в пикселях? Например, та же толщина бордюра.

★★★★★

Последнее исправление: deep-purple (всего исправлений: 1)

можно и без hdpi монитора затестить, но выглядеть будет слишком крупно. нужно только выставить нужные переменные окружения

http://doc.qt.io/qt-5/highdpi.html

anonymous
()

1. Размер виджетов в поинтах, а не в пикселях. Так что да.

2. QPainter использует dpi вьюпорта.

3. 2х

4. hidpi тут не при чём.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

1. Т.е. указанная высота виджета в 5 пикселей, на хайдпи будет смасштабирована до... до чего кстати?

2. Ну оно как бы из первого вытекает, если оно ок, то и это ок.

3. Не понял. Чуть подробнее плиз.

4. Если не затронется пиксмап в иконке, то да, а если затронется, то нет. Хз что они в иконках-пиксмапах намутили с COW. А еще я единожды маску делаю, что тоже может дать негативный эффект при смене дпи.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

5. Что насчет стайлшитов в пикселях? Например, та же толщина бордюра.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

1. Где вы там пиксели увидели? Если вы пишете resize(100, 100), то при масштабе в 2х оно превратится в 200х200 автоматом.

2. QPainter может на много чём рисовать. Если вы будете рисовать QImage, то ему фиолетово на dpi и будет мелко или мыло.

3. Размер иконок зависит от настроек ДЕ, если вы их не хардкодите. А значит нужно увеличивать иконки в Nx раз. 2x сейчас самый распространённый вариант.

Ну или тупо SVG используйте.

4. «при смене дпи» - если вы про динамическую смену DPI, то да, нужно вручную перезагружать иконки.

5. QSS - ССЗБ.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

5. Согласен. Обходил как мог. Но понадобилось застайлить часть приложения, а setStyle() работает только для QApplication, для виджета же игнорируется. Стайлшиты не масштабируются? о_О Их же тоже пейнтер рисует.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Стайлшиты не масштабируются?

Вроде нет. Те, с которыми я сталкивался, не масштабировались. Возможно есть хаки.

RazrFalcon ★★★★★
()
Ответ на: комментарий от deep-purple

Для начала, нужно попробовать писать по-русски.

RazrFalcon ★★★★★
()

проверить сам я не могу

$ QT_SCALE_FACTOR=2.0 <твоё_любимое_приложение_на_Qt>

Потом нажимаешь Alt (или Win) + левую кнопку мыши, двигаешь и изучаешь.

EXL ★★★★★
()
Ответ на: комментарий от EXL

Работа ведётся с куть 5.3 (чтоб и в протухшем дебиане взлетало), где про настоящий хайдпи ещё не в курсе.

Предложенная фича эффекта там не возымела (как и совместно с QT_DEVICE_PIXEL_RATIO и QT_AUTO_SCREEN_SCALE_FACTOR во всех комбинациях, в т.ч. и через export в шелле). Ну оно и понятно:

#if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)
    QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
в этой версии и атрибута то такого нет. Накачу убунточку в виртуалку, соберусь с новой версией — потестию.

Xintrea ты то как с этим разбирался?

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Работа ведётся с куть 5.3 (чтоб и в протухшем дебиане взлетало)

Это же oldstable, зачем так упарываться?

anonymous
()
Ответ на: комментарий от anonymous

Я так некрофилирую. Ты мне запрещаешь?

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Вообще не парился с этим. Насколько я понял, если ставить

QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

то тогда отрисовка виджетов идет с HiDpi точностью, но пользовательский код управляется с какими-то виртуальными, более грубыми пикселями.

Xintrea ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.