Каков наилучший способ масштабирования изображений для высокого DPI в Qt5?

У нас есть различные изображения в нашем приложении (отображаемые из QPixmap в QLabel), которые отображаются с разумным размером на экранах с низким разрешением, но уменьшаются при высоком разрешении. Другие элементы интерфейса выглядят хорошо.

Я посмотрел на функцию devicePixelRatioF (), но она всегда возвращает 1. В моей системе включено 150% масштабирования, поэтому, если я жестко закодировал 1,5 в качестве коэффициента масштабирования, то изображения имеют ожидаемые размеры относительно окна. Вопрос в том, как получить масштабный коэффициент системы, чтобы приложение выглядело одинаково для всех систем с различным разрешением / масштабированием? Как и Windows, приложение построено для Linux.

Буду признателен за любые советы.

1

Решение

Эта проблема побила и меня. Об этом также сообщается в Qt’s баг трекер Вот.

Проблема в том, что 150% масштабирования в Windows не выполняется путем масштабирования всех пикселей в 1,5 раза, а вместо этого — масштабирования шрифтов и «корректировки» пользовательского интерфейса соответственно. Вот почему интервалы и макеты выглядят очень странно, когда выбрано масштабирование 150%.

поскольку devicePixelRatio () запрашивает фактическое соотношение пикселей, и оно не изменяется при установке 150% в Windows, оно по-прежнему возвращает 1.

Если вам действительно нужно значение 1,5 для правильного масштабирования ваших растровых изображений, вы можете самостоятельно рассчитать фактический коэффициент, запросив DPI экрана (см. Документацию Вот).

1

Другие решения

Около экраны с высоким разрешениемЯ думаю, что вы должны смотреть на QScreen::devicePixelRatio свойство, которое

содержит соотношение экрана между физическими пикселями и
независимые от устройства пиксели

а также используйте возвращенное значение, чтобы установить соотношение пикселей с QPixmap::setDevicePixelRatio,

Например:

#include <QApplication>
#include <QDebug>
#include <QScreen>
#include <QPixmap>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);

QPixmap p(32, 32);
QScreen * screen = a.primaryScreen();
p.setDevicePixelRatio(screen->devicePixelRatio());

//...

return a.exec();
}

Около масштабирование системы, Вы можете иметь ключ, проверяющий QScreen::logicalDotsPerInch свойство, например:

int scaling_percent = (screen->logicalDotsPerInch() / 96) * 100;
1

По вопросам рекламы [email protected]