【问题标题】:How to set fixed Icon size that scales with HiDPI in Qt如何在 Qt 中设置随 HiDPI 缩放的固定图标大小
【发布时间】:2023-03-17 04:30:01
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: qt qlabel qicon hidpi


    【解决方案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))
    

    【讨论】:

    • MacOS 应该返回 72.0。
    猜你喜欢
    • 1970-01-01
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 2023-01-18
    • 2020-05-21
    • 2013-09-09
    • 1970-01-01
    相关资源
    最近更新 更多