我需要一种在多个平台之间翻译点大小和像素大小的方法。
我有一个Qt应用程序,必须在多个平台上运行,包括一种平板电脑上的嵌入式Linux。
预期用户可以在桌面(Windows或Linux)上保存应用程序创建的文件,并在自定义设备上打开。
数据由绘图和文本组成 -
对于普通文本,包括所有UI文本,我们使用像素大小而不是点大小来实现类似的外观。但是富文本让我束手无策:
因此,我需要能够在任何地方使用像素大小,然后计算点大小以在段落中设置它(并在读取大小时进行反向计算)。
但是,像素大小和点大小之间有什么关系?如果我针对当前平台上的某个字体确定它们两者,能否建立某种方程式来使用?
编辑 - 我找到了一个有趣的帖子 - 它似乎可以做到我想要的,但它只适用于OSX。https://dev59.com/il8e5IYBdhLWcg3wb56S#25929628
我的目标平台是Windows / Linux / OSX,尤其是运行嵌入式Linux的自定义平板电脑,以及可能在未来的Android设备上。
Qt 4.8
编辑 - 使用下面答案中的转换,左侧文本使用setPixelSize(20),右侧文本使用setPointSize(20 * screenDpi),其中
请注意大小不同...(在Windows上运行,尚未在其他平台上测试)
我甚至试过
我有一个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
setPointSize(20/72 * screenDpi)
,其中qreal screenDpi = QApplication::desktop()->logicalDpiX()
,因为logicalDpi
和physicalDpi
可能是不同的值。 - Kamil Zaripov