Qt :语法: QFont QFontMetrics pointSize 点大小 pixelSize 像素大小 屏幕分辨率 DPI:每英寸像素点

时间:2024-04-05 11:35:52

关键词: QFont QFontMetrics pointSize 点大小 pixelSize 像素大小 屏幕分辨率 DPI:每英寸像素点

总结:

  1. 正常情况下,字体设置都是设置成 像素大小的。 --qss 。
  2. 窗口 组件 这些大小也是按照像素大小来设置的。
  3. 点大小: 物理上的空间大小不变,使用的屏幕像素改变 。
  4. 像素大小: 物理空间大小变化(肉眼区分出大小),屏幕像素个数不变。

相关概念

DPI: Dot per inch,在显示器上也就是每英寸包含的像素。英尺的换算为 1 inch = 2.54 cm。
Qt屏幕DPI计算及pointSize和pixelSize的关系

QFontMetrics :
QFont

QFontMetrics获取字体宽度小示例 :

QFont当中有两种方式设置字体大小,PixelSize、PointSize,即像素大小和点阵大小。
QPointSize实际是磅,也就是 1/72 inch
QPixelSize = DPI * Point / 72
什么是DPI,就是每英寸的点数,大部分显示器的DPI为90.6左右,但windows为了方便就同一了点距,为96。Ubuntu的点距也是96。
字体在屏幕上的实际大小 = 字体像素大小 * 点距。
一般情况用pixel,字体将不受 DPI 的影响,默认是 pointSize。

QFont(“Microsoft YaHei”,15) : 中的15 是** 点大小** 。 --默认的设置的都是点大小。 – 随着DPI 改变而改变。

现在: 屏幕分辨率都是1920*1020 ,但是屏幕大小与明显区别。其中,有显示问题的是小屏幕的。
两个大小不同的屏幕下,QLabel的文字显示的大小却是相似的。—所以在被人的提示下,怀疑是点大小和像素大小的问题。

Qt的pointSize和pixelSize,qt字体大小自适应

使用QFont的setPointSize,此时字体的大小会跟随DPI改变而改变。 【我】物理上的空间大小不变,使用的屏幕像素改变。
使用QFont的setPixelSize,此时字体的大小不会随DPI的改变而发生变化。 【我】 相反,即物理空间大小变化(肉眼区分出大小)。

小屏幕 DPI 大,但是分辨率一样: setPointSize -》 点大小 -》 相对大屏幕的字,用到更多的像素点,但是实际的文字暂用的空间大小(cm)却是一样的。 —如果把这个换成1980*1020的led大屏的话, 那么字就看不到了。
那么问题是:
点大小的标准是什么?【我: 会是有一个标准的DPI下设置的吗?】
为什么用稍微大尺寸的显示屏显示的点大小刚好(因为QLabel setFixHeight = 15 ) 而用小屏幕(笔记本电脑) 就被截断了。
印象中【印象中是用qss的,而且是用的px ,也就是设置像素大小的-不矛盾】和qt 默认都是用的 点大小【qt倒是在构造方法中默认是点大小】???
还有QLabel setFixSize() 的大小是 点大小还是像素大小(从表现来看是像素大小-小屏幕的label小,物理尺寸变小。)
以后设置字体是用默认的点大小还是像素大小?? --从印象中通过qss的方式设置

其他相关知识:

通过qss来实现:
PointSize: font-size:16pt;
PixelSize: font-size:16px; --平时用的。 也就是所按像素大小来绘制的。

QFontMetrics 相关用法

  1. 获取文本+字体大小下的长度和高度大小。
  2. 实现 过长文字内容 用 … 省略的方法。
    QFontMetrics 实现文字显示长度控制 : 参考这个。 关键词:

elidedText()
fontMetrics().width(QString s): //获取字符串s的总像素宽度。
fontMetrics().height(): //获取字体的高度。
fontMetrics().lineSpacing(): //获取字体的高度,包括文字的实际宽度和行距。
fontMetrics().leading(): //行间距

3.Qt 设置依据分辨率改变label字体

注意点:
1.如果在构造函数中就使用SetElideText函数,因为此时窗口未显示,所以这个时候得到的label宽度与显示之后的不同,那么最终显示的文本长度(或…的位置也不正确)
2.QFontMetrics的一个问题

今天发现QFontMetric的一个问题
QFontMetrics可以输入一个字体和一个字符串,计算出字符串在这种字体下的显示尺寸。
这种计算比较耗时间,因此Qt内部应该是缓存了计算结果。具体方法是在第一次调用时,把QFontMetrics绑定的字体内部每个字的尺寸都计算出来,以后对相同字体求大小的时候便可以直接查询每个字的尺寸,最后累加出大小返回给用户。
问题在于QFont允许通过setPointSizeF设置浮点数字号,这样若程序需要动态计算出字号,则每次计算的结果都不相同,于是基本上缓存会无限制增长,形成事实上的内存泄漏。。。
解决方法是尽量采用setPointSize设置整数字号。

Qt 之图形(绘制文本) :

Qt 之图形(绘制文本) : 一去二三里的博客,可以学习下绘制。

其他内容

通过win系统显示改变分辨率来验证猜想:
Qt :语法: QFont QFontMetrics pointSize 点大小 pixelSize 像素大小 屏幕分辨率 DPI:每英寸像素点
通过缩放来改变应用程序的大小,但是这个会改变分辨率吗?
Qt :语法: QFont QFontMetrics pointSize 点大小 pixelSize 像素大小 屏幕分辨率 DPI:每英寸像素点