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

时间:2017-02-09 16:01:08

标签: qt fonts font-size

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

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

数据由#ifdef Q_OS_WIN32 qreal screenDpi = QApplication::desktop()->physicalDpiX() / 96.; #else qreal screenDpi = QApplication::desktop()->physicalDpiX() / 72.; #endif 上的图纸和文字{{1}}组成。有些文本项目是"富文本",因此我们可以更改文本片段的字体。

对于普通文本,包括所有UI文本,我们使用像素大小而不是点大小来实现类似的外观。但富文本却让我不满意:{{1}}没有{{1}}选项。仅限{{1}}和{{1}}。我可以使用{{1}}然后使用{{1}},但结果是在保存时使用{{1}}方法丢失了所有字体信息。 (必须是qt bug?)

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

但是 - 像素大小和磅值之间的关系是什么?如果我确定当前平台上的给定字体,我可以建立某种方程式来使用吗?

编辑 - 我发现了一篇有趣的帖子 - 它似乎做了我想要的,但它只针对OSX。 https://stackoverflow.com/a/25929628/1217150
我的目标平台,Windows / Linux / OSX,尤其是运行嵌入式Linux的自定义平板电脑,可能还有未来的Android设备。

Qt 4.8

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

{{1}}

注意大小不一样...(在Windows中运行,尚未在其他平台上测试)

我甚至尝试过

{{1}}

enter image description here

2 个答案:

答案 0 :(得分:3)

是的,我认为有可能:

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";

答案 1 :(得分:0)

但是富文本让我反感:QTextCharFormat没有pixelSize()选项。仅setFontPointSize()和fontPointSize()。

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

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