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

如何在Qt中设置与HiDPI一起缩放的固定图标大小,qt,qlabel,qicon,hidpi,Qt,Qlabel,Qicon,Hidpi,我如何在应用程序中设置图标大小,以便在用户使用屏幕缩放时仍能缩放图标 在我的应用程序中,主窗口中有一个QToolBar,它似乎使用24x24的图标大小。我有一些QToolButton,默认情况下图标大小为20x20,因此我必须手动将其设置为24x24,以便所有图标大小相同,使用setIconSize(QSize(24,24))。无需缩放即可正常工作: 当桌面启用某些缩放功能时,固定大小的图标不会缩放,如下所示: 我的另一个用例是在QLabel中显示图标,在那里我必须在将QIcon转换为QPi

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

在我的应用程序中,主窗口中有一个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进行测试),但修复了我的用例

我编写了一个简单的类,可以将所有固定大小缩放到正确的值:

#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;
}

对于MacOS,您应该返回72.0。
ScaledSizeProvider::getScaledSize(QSize(24, 24))