将像素大小转换为多平台字体的点大小
Convert pixel size to point size for fonts on multiple platforms
我需要一种在多个平台之间转换点大小和像素大小的方法。
我有一个 Qt 应用程序必须 运行 在多平台上,包括在一种平板电脑上的嵌入式 Linux。
预计用户可以将应用程序创建的文件保存在桌面上(windows 或 linux)并在自定义设备上打开。
数据由图画和文字组成 - QGraphicsItem
QGraphicsScene
上的文字。一些文本项是 "rich text",因此我们可以更改文本片段的字体。
对于普通文本,包括所有 UI 文本,我们使用像素大小而不是点大小来实现相似的外观。但是富文本使我无法接受:QTextCharFormat
没有 pixelSize()
选项。只有 setFontPointSize()
和 fontPointSize()
。我可以使用 font().setPixelSize()
然后 setFont()
但结果是,在使用 html()
方法保存时,我丢失了所有字体信息。 (一定是 qt 错误?)
所以,我需要的是能够在任何地方使用像素大小,然后计算点大小以将其设置在段落上(并在读取大小时反向)。
但是 - 像素大小和点大小之间的关系是什么?如果我确定两者,对于给定的字体,在当前平台上,我可以建立某种等式来使用吗?
编辑 - 我发现了一个有趣的 post - 它似乎可以满足我的要求,但它只针对 OSX。
我的目标平台,Windows / Linux / OSX,尤其是定制平板电脑 运行ning 嵌入式 Linux,未来可能 [=50] =] 设备。
Qt 4.8
编辑 - 使用下面答案中的转换,左侧文本使用 setPixelSize(20),右侧文本使用 setPointSize(20 * screenDpi),其中
qreal screenDpi = QApplication::desktop()->physicalDpiX() / 72.;
注意大小不一样...(运行ning in windows,尚未在其他平台测试)
我什至试过了
#ifdef Q_OS_WIN32
qreal screenDpi = QApplication::desktop()->physicalDpiX() / 96.;
#else
qreal screenDpi = QApplication::desktop()->physicalDpiX() / 72.;
#endif
是的,我认为有可能:
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";
But rich text defies me: the QTextCharFormat doesn't have a pixelSize() option. Only setFontPointSize() and fontPointSize().
您可以使用 QTextCharFormat::FontPropertiesSpecifiedOnly 行为参数设置准备好的 QFont 以仅设置 pixelSize:
QFont font;
font.setPixelSize(18);
QTextCharFormat fmt;
fmt.setFont(font, QTextCharFormat::FontPropertiesSpecifiedOnly);
我需要一种在多个平台之间转换点大小和像素大小的方法。
我有一个 Qt 应用程序必须 运行 在多平台上,包括在一种平板电脑上的嵌入式 Linux。
预计用户可以将应用程序创建的文件保存在桌面上(windows 或 linux)并在自定义设备上打开。
数据由图画和文字组成 - QGraphicsItem
QGraphicsScene
上的文字。一些文本项是 "rich text",因此我们可以更改文本片段的字体。
对于普通文本,包括所有 UI 文本,我们使用像素大小而不是点大小来实现相似的外观。但是富文本使我无法接受:QTextCharFormat
没有 pixelSize()
选项。只有 setFontPointSize()
和 fontPointSize()
。我可以使用 font().setPixelSize()
然后 setFont()
但结果是,在使用 html()
方法保存时,我丢失了所有字体信息。 (一定是 qt 错误?)
所以,我需要的是能够在任何地方使用像素大小,然后计算点大小以将其设置在段落上(并在读取大小时反向)。
但是 - 像素大小和点大小之间的关系是什么?如果我确定两者,对于给定的字体,在当前平台上,我可以建立某种等式来使用吗?
编辑 - 我发现了一个有趣的 post - 它似乎可以满足我的要求,但它只针对 OSX。
我的目标平台,Windows / Linux / OSX,尤其是定制平板电脑 运行ning 嵌入式 Linux,未来可能 [=50] =] 设备。
Qt 4.8
编辑 - 使用下面答案中的转换,左侧文本使用 setPixelSize(20),右侧文本使用 setPointSize(20 * screenDpi),其中
qreal screenDpi = QApplication::desktop()->physicalDpiX() / 72.;
注意大小不一样...(运行ning in windows,尚未在其他平台测试)
我什至试过了
#ifdef Q_OS_WIN32
qreal screenDpi = QApplication::desktop()->physicalDpiX() / 96.;
#else
qreal screenDpi = QApplication::desktop()->physicalDpiX() / 72.;
#endif
是的,我认为有可能:
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";
But rich text defies me: the QTextCharFormat doesn't have a pixelSize() option. Only setFontPointSize() and fontPointSize().
您可以使用 QTextCharFormat::FontPropertiesSpecifiedOnly 行为参数设置准备好的 QFont 以仅设置 pixelSize:
QFont font;
font.setPixelSize(18);
QTextCharFormat fmt;
fmt.setFont(font, QTextCharFormat::FontPropertiesSpecifiedOnly);