Как установить фиксированный размер иконки, который масштабируется с помощью HiDPI в Qt - PullRequest
0 голосов
/ 17 февраля 2020

Как я могу установить размер иконки в моем приложении, чтобы он по-прежнему масштабировался, когда пользователи используют масштабирование экрана?

В моем приложении в MainWindow есть QToolBar, который, кажется, использует значок размером 24x24. У меня есть некоторый QToolButton, который, по-видимому, по умолчанию получает размер значков 20x20, поэтому мне пришлось вручную установить его на 24x24, чтобы все значки имели одинаковый размер с setIconSize(QSize(24, 24));. Работает нормально без масштабирования:

enter image description here

Когда на рабочем столе включено некоторое масштабирование, значки с фиксированным размером не масштабируются, это выглядит как это:

enter image description here

Другой вариант использования, который у меня есть, это отображение значков в QLabels, там я должен указать размер при преобразовании QIcon в QPixmap, это также не масштабируется mImageLabel->setPixmap(icon().pixmap(QSize(24, 24)));

Что лучше, чем умножать на коэффициент масштабирования? Как получить масштабный коэффициент?

1 Ответ

0 голосов
/ 20 февраля 2020

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

Я написал простой класс, который масштабирует весь мой фиксированный размер до правильного значения:

#include <QApplication>
#include <QDesktopWidget>    

QSize ScaledSizeProvider::getScaledSize(const QSize &size)
{
    return {static_cast<int>(size.width() * getXScaleFactor()), static_cast<int>(size.height() * getYScaleFactor())};
}

qreal ScaledSizeProvider::getXScaleFactor()
{
    auto desktopWidget = QApplication::desktop();
    return desktopWidget->logicalDpiX() / getReferenceDpiValue();
}
qreal ScaledSizeProvider::getYScaleFactor()
{
    auto desktopWidget = QApplication::desktop();
    return desktopWidget->logicalDpiY() / getReferenceDpiValue();
}

qreal ScaledSizeProvider::getReferenceDpiValue()
{
    return 96.0;
}

И просто извлекает правильное значение с помощью:

ScaledSizeProvider::getScaledSize(QSize(24, 24))
...