首页 > 解决方案 > 如何在 Qt 中设置随 HiDPI 缩放的固定图标大小

问题描述

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

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

在此处输入图像描述

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

在此处输入图像描述

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

有没有更好的为什么然后乘以比例因子?如何获得比例因子?

标签: qtqlabelqiconhidpi

解决方案


看起来设置固定大小会阻止 Qt 端的任何缩放,因此我们需要手动调整大小。就我而言,似乎可以通过将logicalDpi除以96来获得正确的比例因子,这是比例因子为1的DPI。我不确定这是否是所有用例的最佳解决方案(尚未针对例如 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))

推荐阅读