Python入坑系列-pyside6桌面编程之认识并设置理想字体效果

通过本文章,可以掌握以下内容:

  1. Pyside6 如何设置字体
  2. QFont和部件自带字体有什么不同
  3. 通过QSS如何控制字体样式
  4. 设置字体一些常用技巧

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

使用绝对值来指定间距,不随字体大小变化

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐