Python入坑系列-pyside6桌面编程之认识并设置理想字体效果
通过本文章,可以掌握以下内容:
- Pyside6 如何设置字体
- QFont和部件自带字体有什么不同
- 通过QSS如何控制字体样式
- 设置字体一些常用技巧
1、Pyside6 字体介绍
在开发桌面程序时,尽量保持字体统一风格,保持最佳展示效果。
字体
Pyside6有他自己字体实现机制,主要通过QFont、QFontInfo、QFontMetrics、QFontMetricsF设置字体效果,但比使用html字体样式复杂的多,需要通过这些类的接口来查询和设置字体各种属性,最后由操作系统来渲染。字体匹配算法过程如下:
- 首先搜索指定的字体家族(通过setFamilies()设置)。
- 如果没有找到,将选择一个支持书写系统的替代字体。字体匹配算法将尝试找到最佳匹配所有在QFont中设置的属性。这个过程在不同的平台上有所不同。
- 如果系统上不存在可以支持文本的字体,那么将在其位置显示特殊的“缺失字符”框。
QFont
QFont类是用来处理字体的主要方式,可以指定字体的各种属性,如字体家族、大小、加粗、斜体等。Font不仅用于文本的显示,还可以用于图形界面中文本的绘制。代码示例如下:
from PySide6.QtGui import QFont
# 创建一个QFont对象
font = QFont()
# 设置字体家族
font.setFamily("Arial")
# 设置字体大小
font.setPointSize(10)
# 设置字体加粗
font.setBold(True)
# 设置字体斜体
font.setItalic(False)
常用方法
- setFamily(family): 设置字体家族。例如,font.setFamily("Arial")。
- setPointSize(size): 设置字体的点大小。例如,font.setPointSize(12)。
- setPixelSize(size): 设置字体的像素大小。这对于确保字体在不同分辨率的屏幕上具有一致的视觉大小很有用。
- setWeight(weight): 设置字体的粗细。QFont类提供了枚举值来表示不同的字体粗细,如QFont::Bold。
- setBold(bold): 设置字体是否加粗。传入True或False。
- setItalic(italic): 设置字体是否斜体。传入True或False。
- setUnderline(underline): 设置字体是否有下划线。传入True或False。
- setStrikeOut(strikeOut): 设置字体是否有删除线。传入True或False。
获取字体属性
- family(): 返回字体家族名称。
- pointSize(): 返回字体的点大小。
- pixelSize(): 返回字体的像素大小。
- weight(): 返回字体的粗细。
- bold(): 返回字体是否加粗。
- italic(): 返回字体是否斜体。
- underline(): 返回字体是否有下划线。
- strikeOut(): 返回字体是否有删除线。
QFontInfo
QFontInfo类在Qt中用于提供关于字体的详细信息。使用QFont对象设置了字体后,可能需要获取这个字体的一些实际使用的属性,比如实际的字体家族、字体大小、是否加粗等。运行示例:
from PySide6.QtGui import QFont, QFontInfo
font = QFont("Arial", 10)
fontInfo = QFontInfo(font)
创建了QFontInfo对象后,可以使用它来获取字体的各种信息:
- family(): 返回字体家族的名称。
- pointSize(): 返回字体的点大小。
- pixelSize(): 返回字体的像素大小。
- italic(): 返回字体是否为斜体。
- bold(): 返回字体是否加粗。
- weight(): 返回字体的权重。
- exactMatch(): 检查请求的字体设置是否与系统中的字体完全匹配。
QFontMetrics
QFontMetrics类在PySide6中用于提供关于字体的度量信息,如字体的高度、宽度、行距等。这些信息对于在图形用户界面(GUI)中进行精确的文本布局非常重要。QFontMetrics对象是基于QFont对象创建的,它反映了字体在特定设备上的渲染方式。示例代码如下:
from PySide6.QtGui import QFont, QFontMetrics
font = QFont("Arial", 10)
metrics = QFontMetrics(font)
常用方法:
- height(): 返回字体的高度(基线到基线的距离)。
- ascent(): 返回字体基线以上的最大高度。
- descent(): 返回字体基线以下的最大深度。
- leading(): 返回行间距(两行基线之间的距离减去字体高度)。
- lineSpacing(): 返回行距(基线到基线的距离,等于ascent + descent + leading)。
- averageCharWidth(): 返回字体中字符的平均宽度。
- maxWidth(): 返回字体中最宽字符的宽度。
- width(text): 返回给定文本字符串的宽度。在PySide6中,这个方法已经被horizontalAdvance(text)替代。
- horizontalAdvance(text): 返回给定文本字符串的水平进展宽度,即渲染文本所需的像素宽度。
QFontMetricsF
QFontMetricsF类在PySide6中提供了一种方式来获取关于字体的度量信息,与QFontMetrics类似,但它提供了浮点数精度的度量值。这使得QFontMetricsF在需要高精度布局时特别有用,比如在绘图应用或者需要精确控制文本布局的场景中。QFontMetricsF对象是基于QFont对象创建的。需要先有一个QFont对象,然后使用这个QFont对象来创建一个QFontMetricsF对象,代码示例如下:
from PySide6.QtGui import QFont, QFontMetricsF
font = QFont("Arial", 10)
metricsF = QFontMetricsF(font)
常用方法:
- ascent(): 返回字体基线以上的最大高度(浮点数)。
- descent(): 返回字体基线以下的最大深度(浮点数)。
- height(): 返回字体的高度,即基线到基线的距离(浮点数)。
- leading(): 返回行间距,即两行文本基线之间的距离减去字体高度(浮点数)。
- lineSpacing(): 返回行距,即基线到基线的距离,包括行间距(浮点数)。
- averageCharWidth(): 返回字体中字符的平均宽度(浮点数)。
- maxWidth(): 返回字体中最宽字符的宽度(浮点数)。
- horizontalAdvance(text): 返回给定文本字符串的水平进展宽度,即渲染文本所需的像素宽度(浮点数)
QFont和部件自带字体对比
在PySide6(和整个Qt框架)中,每个窗口小部件(Widget)都有一个自带的字体,这个字体是从其父窗口小部件继承而来的,最终追溯到应用程序的全局字体设置。QFont对象则是用来描述字体的各种属性的,比如字体家族(如Arial、Courier等)、大小、加粗、斜体等。当创建一个窗口小部件时,它会自动使用当前Qt应用程序的默认字体设置。如果没有特别指定一个字体,那么它就会使用这个默认字体。可以通过修改小部件的QFont来改变其显示文本的字体样式。这实际上是通过调用小部件的setFont()方法并传递一个QFont对象来实现的。这里的关系是:QFont是一个工具,用于定义字体的具体样式;而小部件的字体属性,则是实际应用这些样式的地方。通过改变小部件的QFont,可以控制其文本显示的具体外观。
以下是修改全局字体样式示例代码:
QFont和部件自带字体对比
Qss字体样式
QSS提供了一种类似于CSS的方式来设置应用程序的样式,包括字体。这种方法更加灵活,可以在不修改Python代码的情况下调整样式。示例代码:
from PySide6.QtWidgets import QApplication, QLabel
if __name__ == '__main__':
app = QApplication([])
# 创建标签
label = QLabel("Hello, PySide6 with QSS!")
# 使用QSS设置字体样式
label.setStyleSheet("""
QLabel {
font-family: Arial;
font-size: 10pt;
font-weight: bold;
}
""")
label.setMinimumSize(400,300)
label.show()
app.exec()
选择使用QFont还是QSS:
- 编程控制 vs. 样式表:如果希望在代码中直接控制字体样式,或者需要根据某些逻辑动态改变字体样式,使用QFont会更合适。如果倾向于分离样式和逻辑,或者希望能够轻松地调整应用程序的外观而不触碰Python代码,QSS将是更好的选择。
- 应用范围:QFont设置的字体样式仅适用于单个控件或通过代码显式设置的控件集。而QSS可以通过选择器应用于整个应用程序或特定类型的控件,使得统一设置样式变得更加容易
2、字体一些常用技巧
字号统一
保持主标题、标题、小标题、正文、正文(小),辅助文字,部件字体大小统一,会让界面开重点突出,整洁,清晰
层级 | 字体大小 |
辅助文字 | 12px Extra Small |
正文(小) | 13px Small |
正文 | 14px Base |
小标题 | 16px Medium |
标题 | 18px large |
主标题 | 20px Extra large |
QFont方法与Qss样式名称对应关系
Qfont方法 | Qsss样式 | 作用 |
StyleHint | font-family | 提供了关于字体外观的一般提示,如是否是衬线、无衬线等 |
StyleStrategy | font-smooth | 用于控制字体选择和渲染的更细节策略,如是否允许位图字体或强制抗锯齿 |
HintingPreference | 无 | 控制字体微调的偏好设置 |
Weight | font-weight | 指定字体的粗细 |
Style | font-style | 指定字体的风格,如正常、斜体或倾斜 |
Stretch | font-stretch | 指定字体的拉伸程度 |
Capitalization | text-transform | 控制文本的大小写转换 |
SpacingType | letter-spacing和line-height | 用于控制字间距和行间距 |
StyleHint枚举值
StyleHint是QFont类中的一个枚举,用于指导字体匹配算法选择合适的默认字体家族,当指定的字体家族不可用时。这些样式提示帮助Qt选择一个视觉上接近用户需求的字体
枚举值 | 描述 |
QFont.AnyStyle | 不指定特定风格,让Qt选择最合适的字体 |
QFont.SansSerif | 无衬线字体,这种字体的笔画具有相同的粗细,看起来更加简洁和现代。常用于用户界面和屏幕阅读 |
QFont.Helvetica | 指定Helvetica字体或其类似物。Helvetica是一种广泛使用的无衬线字体 |
QFont.Serif | 衬线字体,这种字体在字母的笔画开始和结束的地方有额外的装饰,常用于打印文档和长篇阅读 |
QFont.Times | 指定Times Roman字体或其类似物。Times Roman是一种经典的衬线字体 |
QFont.TypeWriter | 指定等宽(打字机式)字体,每个字符占据相同的水平空间,常用于代码编辑器和文档 |
QFont.Courier | 指定Courier字体或其类似物。Courier是一种常见的等宽字体 |
QFont.OldEnglish | 指定老英式字体,这种字体模仿了中世纪手稿的书写风格,常用于装饰和特殊场合 |
QFont.Decorative | 装饰性字体,用于特殊效果和装饰用途,不建议用于正文文本 |
QFont.Monospace | 等宽字体,每个字符占据相同的水平空间,适用于代码显示和文档,确保对齐 |
QFont.Fantasy | 字体匹配器更倾向于选择映射到CSS通用字体族“fantasy”的字体 |
QFont.Cursive | 字体匹配器更倾向于选择映射到CSS通用字体族“cursive”的字体 |
QFont.System | 系统字体,使用操作系统的默认用户界面字体 |
HintingPreference枚举
可以应用于字形的不同级别的微调,以改善在像素密度可能需要时显示器上的可读性
枚举值 | 描述 |
QFont.PreferDefaultHinting | 默认的微调偏好,让系统选择最适合当前字体和大小的微调级别。这通常意味着在大字号下使用较少的微调,在小字号下使用更多的微调来保持字形的清晰度 |
QFont.PreferNoHinting | 指示不使用微调。这可能会导致字体在小尺寸时看起来不够清晰,但可以保持字形的原始比例和形状,对于某些设计或艺术项目来说可能是首选 |
QFont.PreferVerticalHinting | 只使用垂直方向的微调,而不对水平方向进行微调。这种偏好设置可以改善文本的垂直对齐,同时保持字母宽度的自然比例,适用于需要垂直对齐但又不希望字母过于扁平的场景 |
QFont.PreferFullHinting | 指示使用完全微调,即在水平和垂直方向上都进行微调。这通常提供了最佳的文本清晰度和可读性,特别是在小字号下,但可能会稍微改变字形的原始比例 |
Weight枚举
Qt使用一个从1到1000的权重刻度,与OpenType兼容。权重为1将是细薄的,而1000将是极黑的
枚举值 | 描述 |
QFont.Thin | 100 |
QFont.ExtraLight | 200 |
QFont.Light | 300 |
QFont.Normal | 400 |
QFont.Medium | 500 |
QFont.DemiBold | 600 |
QFont.Bold | 700 |
QFont.ExtraBold | 800 |
QFont.Black | 900 |
Style枚举
用于显示文本的不同字形风格
枚举值 | 描述 |
QFont.StyleNormal | 默认设置,表示字体以其常规风格显示,没有任何倾斜或斜体效果。这适用于大多数文本内容,提供了清晰且易于阅读的文本外观 |
QFont.StyleItalic | 指定字体以斜体风格显示。斜体通常用于强调文本中的某些单词或短语,或在引用、技术术语和外来语中使用。斜体风格是通过字体本身的斜体版本实现的,具有特定的设计调整,以保持美观和可读性 |
QFont.StyleOblique | 指定字体以倾斜风格显示。倾斜风格类似于斜体,但是通过将常规字体简单地倾斜一定角度来实现,而不是使用专门设计的斜体字形。倾斜风格可能不如真正的斜体风格在视觉上吸引人,但在没有斜体版本的字体中提供了一种替代方案 |
Stretch枚举
预定义的拉伸值遵循CSS命名约定。值越高,文本拉伸得越多
枚举值 | 描述 |
QFont.AnyStretch | 接受使用其他QFont属性匹配的任何拉伸(在Qt 5.8中添加 |
QFont.UltraCondensed | 50 |
QFont.ExtraCondensed | 62 |
QFont.Condensed | 75 |
QFont.SemiCondensed | 87 |
QFont.Unstretched | 100 |
QFont.SemiExpanded | 112 |
QFont.Expanded | 125 |
QFont.ExtraExpanded | 150 |
QFont.UltraExpanded | 200 |
Capitalization枚举
用于文本的渲染选项
枚举值 | 描述 |
QFont.MixedCase | 默认设置,不对文本的大小写进行任何改变,文本按照原样显示 |
QFont.AllUppercase | 将所有文本转换为大写字母。这个设置可以用于需要强调或统一文本外观的场景 |
QFont.AllLowercase | 将所有文本转换为小写字母。这可以用于某些设计风格,要求文本以全小写字母显示。 |
QFont.SmallCaps | 将所有文本转换为小型大写字母(small caps)。这意味着小写字母会被转换为小号的大写字母形式,通常用于书籍章节标题或其他需要装饰性大写字母的地方。 |
QFont.Capitalize | 将每个单词的首字母大写。这个设置适用于需要标题风格的文本,例如书籍或文章标题。 |
SpacingType
用于控制字间距和行间距
枚举值 | 描述 |
QFont.PercentageSpacing | 使用百分比来指定间距,允许根据字体大小动态调整间距 |
QFont.AbsoluteSpacing | 使用绝对值来指定间距,不随字体大小变化 |