将像素大小转换为多平台字体的磅大小

Tha*_*lia 3 fonts qt font-size

我需要一种在多个平台之间转换点大小和像素大小的方法。

我有一个必须在多平台上运行的 Qt 应用程序,包括一种平板电脑上的嵌入式 Linux。
预计用户可以将应用程序创建的文件保存在桌面(windows 或 linux)上并在自定义设备上打开。

数据由图纸和 .s 文件QGraphicsItem上的文本组成QGraphicsScene。一些文本项是“富文本”,因此我们可以更改文本片段的字体。

对于普通文本,包括所有 UI 文本,我们使用像素大小而不是点大小来实现类似的外观。但是富文本无视我:QTextCharFormat没有pixelSize()选择。只有setFontPointSize()fontPointSize()。我可以使用font().setPixelSize(),然后setFont(),但结果是,保存时,使用的html()方法,我失去了所有的字体信息。(一定是qt错误?)

所以,我需要的是能够在任何地方使用像素大小,然后计算点大小以将其设置在段落上(并在读取大小时反向)。

但是 - 像素大小和点大小之间的关系是什么?如果我在当前平台上为给定的字体确定了两者,我是否可以建立某种等式来使用?

编辑 - 我发现了一个有趣的帖子 - 它似乎可以做我想做的事,但它只针对 OSX。/sf/answers/1815073991/
我的目标平台,Windows / Linux / OSX,但特别是运行嵌入式 Linux 的定制平板电脑,可能在未来的 Android 设备中使用。

Qt 4.8

编辑 - 使用下面答案中的转换,使用 setPixelSize(20) 的左侧文本和使用 setPointSize(20 * screenDpi) 的右侧文本,其中

qreal screenDpi = QApplication::desktop()->physicalDpiX() / 72.;
Run Code Online (Sandbox Code Playgroud)

注意大小不一样...(在windows下运行,其他平台还没有测试过)

我什至试过

#ifdef Q_OS_WIN32
    qreal screenDpi = QApplication::desktop()->physicalDpiX() / 96.;
#else
    qreal screenDpi = QApplication::desktop()->physicalDpiX() / 72.;
#endif
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Kam*_*pov 6

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

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";
Run Code Online (Sandbox Code Playgroud)