【问题标题】:Convert pixel size to point size for fonts on multiple platforms将像素大小转换为多个平台上字体的磅值
【发布时间】: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) where qreal screenDpi = QApplication::desktop()->logicalDpiX() 因为logicalDpiphysicalDpi 可以是不同的值。

标签: qt fonts font-size


【解决方案1】:

是的,我认为这是可能的:

double ptToPx(double pt, double dpi) {
    return pt/72*dpi
}

double pxToPt(double px, double dpi) {
    return px*72/dpi
}

...

double dpi = QGuiApplication::primaryScreen()->physicalDotsPerInch();
qDebug() << "12 pt is" << ptToPx(12, dpi) << "px";
qDebug() << "26 px is" << pxToPt(26, dpi) << "pt";

【讨论】:

【解决方案2】:

但富文本不符合我的要求:QTextCharFormat 没有 pixelSize() 选项。只有 setFontPointSize() 和 fontPointSize()。

您可以使用 QTextCharFormat::FontPropertiesSpecifiedOnly 行为参数设置准备好的 QFont 以仅设置 pixelSize

QFont font;
font.setPixelSize(18);
QTextCharFormat fmt;
fmt.setFont(font, QTextCharFormat::FontPropertiesSpecifiedOnly);

【讨论】:

  • 这并不能解决问题。引用我自己的话:“我可以使用 font().setPixelSize() 然后 setFont() 但结果是,使用 html() 方法保存时,我会丢失所有字体信息。”此外,这仅从 5.3 开始可用。
猜你喜欢
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 2014-03-03
  • 2013-07-07
  • 2013-04-24
  • 2015-07-05
相关资源
最近更新 更多