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

3
如何在我的应用程序中设置图标大小,以便在用户使用屏幕缩放时仍然按比例缩放?
在我的应用程序中,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个回答

1
看起来设置固定大小会阻止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))

1
你应该在MacOS上返回72.0。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接