【发布时间】:2023-03-14 12:33:01
【问题描述】:
我需要一种在多个平台之间转换点大小和像素大小的方法。
我有一个必须在多平台上运行的 Qt 应用程序,包括一种平板电脑上的嵌入式 Linux。
预计用户可以将应用程序创建的文件保存在桌面(windows 或 linux)上并在自定义设备上打开。
数据包含绘图和文本 - QGraphicsItems 上的 QGraphicsScene。有些文本项是“富文本”,因此我们可以更改文本片段的字体。
对于普通文本,包括所有 UI 文本,我们使用像素大小而不是磅值来实现相似的外观。但是富文本不符合我的要求:QTextCharFormat 没有pixelSize() 选项。只有setFontPointSize() 和fontPointSize()。我可以使用font().setPixelSize(),然后使用setFont(),但结果是在保存时,使用html() 方法,我丢失了所有字体信息。 (一定是qt的bug吧?)
所以,我需要的是能够在任何地方使用像素大小,然后计算点大小以将其设置在段落上(并在读取大小时反向)。
但是 - 像素大小和点大小之间的关系是什么?如果我在当前平台上针对给定字体确定两者,我可以建立某种方程式来使用吗?
编辑 - 我发现了一篇有趣的帖子 - 它似乎可以满足我的要求,但它仅适用于 OSX。 https://stackoverflow.com/a/25929628/1217150
我的目标平台是 Windows / Linux / OSX,尤其是运行嵌入式 Linux 的定制平板电脑,以及未来可能的 Android 设备。
Qt 4.8
编辑 - 使用下面答案中的转换,左侧文本使用 setPixelSize(20),右侧文本使用 setPointSize(20 * screenDpi) where
qreal screenDpi = QApplication::desktop()->physicalDpiX() / 72.;
注意大小不一样...(windows下运行,其他平台暂未测试)
我什至尝试过
#ifdef Q_OS_WIN32
qreal screenDpi = QApplication::desktop()->physicalDpiX() / 96.;
#else
qreal screenDpi = QApplication::desktop()->physicalDpiX() / 72.;
#endif
【问题讨论】:
-
尝试使用
setPointSize(20/72 * screenDpi)whereqreal screenDpi = QApplication::desktop()->logicalDpiX()因为logicalDpi和physicalDpi可以是不同的值。