我需要一种在多个平台之间转换点大小和像素大小的方法。
我有一个必须在多平台上运行的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}}
答案 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);