如何在 Qt 中设置随 HiDPI 缩放的固定图标大小

How to set fixed Icon size that scales with HiDPI in Qt

如何在我的应用程序中设置图标大小,以便在用户使用屏幕缩放时它仍然缩放?

在我的应用程序中,我在 MainWindow 中有一个 QToolBar,它似乎使用 24x24 的图标大小。我有一些 QToolButton,默认情况下它的图标大小似乎为 20x20,因此我不得不手动将其设置为 24x24 以使所有图标具有相同的大小,setIconSize(QSize(24, 24));。无需缩放即可正常工作:

当桌面启用了一些缩放时,固定大小的图标不会缩放,然后看起来像这样:

我的另一个用例是在 QLabel 中显示图标,在将 QIcon 转换为 QPixmap 时我必须指定大小,这也无法缩放 mImageLabel->setPixmap(icon().pixmap(QSize(24, 24)));

乘以比例因子有没有更好的原因?如何获取比例因子?

看起来设置固定大小会阻止 Qt 端的任何缩放,因此我们需要手动调整大小。在我的例子中,我似乎可以通过将 logicalDpi 除以 96 来获得正确的比例因子,这是比例因子为 1 的 DPI。我不确定这是否是所有用例的最佳解决方案(尚未测试例如 MacOS)但修复了我的用例。

我写了一个简单的 class 将我所有的固定大小缩放到正确的值:

#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))