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

问题描述 投票:0回答:1

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

在我的应用程序中,我在MainWindow中有一个QToolBar,它似乎使用24x24的Icon大小。我有一些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)));

还有什么更好的理由,然后再乘以比例因子?如何获得比例因子?

qt qlabel qicon hidpi
1个回答
0
投票

似乎设置为固定大小会阻止从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))
© www.soinside.com 2019 - 2024. All rights reserved.