qt - 如何在 Qt 中设置随 HiDPI 缩放的固定图标大小
问题描述
如何在我的应用程序中设置图标大小,以便在用户使用屏幕缩放时它仍然可以缩放?
在我的应用程序中,我在 MainWindow 中有一个 QToolBar,它似乎使用了 24x24 的图标大小。我有一些 QToolButton,默认情况下似乎获得了 20x20 的图标大小,所以我必须手动将其设置为 24x24 以使所有图标大小相同,使用setIconSize(QSize(24, 24));
. 无需缩放即可正常工作:
当桌面启用了一些缩放时,具有固定大小的图标不会被缩放,这看起来像这样:
我的另一个用例是在 QLabels 中显示图标,我必须在将 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;
}
并且简单地通过以下方式获取正确的值:
ScaledSizeProvider::getScaledSize(QSize(24, 24))
推荐阅读
- javascript - 文件附件未打开 - 不允许出现错误
- delphi - 如何(真正)清空 TClientDataSet
- wordpress - 使用 Wordpress、Identity Server 4 和 ASP .Net Core 的 SSO
- git - 是否可以在企业架构师中使用 git 进行版本控制
- javascript - 循环问题的NodeJS变量范围,express/mongoose
- python - Python:将秒从初始日期转换为日期时间
- r - 通过 API 将 HubSpot 连接到 SQL Server
- mysql - mysql中带有交叉连接的UPDATE语句
- yii2 - Yii2 虚拟属性出 SqlDataProvider 的一个属性
- linker - 如何在命令提示符窗口中制作链接文件?