在多个平台上将像素大小转换为字体点大小

5
我需要一种在多个平台之间翻译点大小和像素大小的方法。
我有一个Qt应用程序,必须在多个平台上运行,包括一种平板电脑上的嵌入式Linux。
预期用户可以在桌面(Windows或Linux)上保存应用程序创建的文件,并在自定义设备上打开。
数据由绘图和文本组成 - QGraphicsScene 上的 QGraphicsItem。一些文本项是“富文本”,因此我们可以更改文本片段的字体。
对于普通文本,包括所有UI文本,我们使用像素大小而不是点大小来实现类似的外观。但是富文本让我束手无策: QTextCharFormat 没有 pixelSize() 选项。只有 setFontPointSize()fontPointSize()。我可以使用 font().setPixelSize() 然后使用 setFont(),但结果是当使用 html() 方法保存时,我会失去所有字体信息。(可能是qt的bug?)
因此,我需要能够在任何地方使用像素大小,然后计算点大小以在段落中设置它(并在读取大小时进行反向计算)。
但是,像素大小和点大小之间有什么关系?如果我针对当前平台上的某个字体确定它们两者,能否建立某种方程式来使用?
编辑 - 我找到了一个有趣的帖子 - 它似乎可以做到我想要的,但它只适用于OSX。https://dev59.com/il8e5IYBdhLWcg3wb56S#25929628
我的目标平台是Windows / Linux / OSX,尤其是运行嵌入式Linux的自定义平板电脑,以及可能在未来的Android设备上。
Qt 4.8
编辑 - 使用下面答案中的转换,左侧文本使用setPixelSize(20),右侧文本使用setPointSize(20 * screenDpi),其中
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

enter image description here


尝试使用setPointSize(20/72 * screenDpi),其中qreal screenDpi = QApplication::desktop()->logicalDpiX(),因为logicalDpiphysicalDpi可能是不同的值。 - Kamil Zaripov
2个回答

9

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

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

有没有 QGuiApplication 的替代方案?我只能使用 Qt 4.8。 - Thalia
这里是一个使用qt 4.8获取逻辑DPI的示例:https://dev59.com/a3rZa4cB1Zd3GeqP0kqz#23513221。 - Kamil Zaripov
为什么将12和26传递给函数? - RKum
只是一个 pt -> px 转换的例子,没有特殊含义。 - Kamil Zaripov

0
但是富文本让我无法应对: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版本以上可用。 - Thalia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接