Qt扫盲-QFont理论总结

2023-11-03 02:30
文章标签 总结 qt 理论 扫盲 qfont

本文主要是介绍Qt扫盲-QFont理论总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

QFont 理论总结

  • 一、概述
  • 二、使用
  • 三、字体匹配算法

一、概述

QFont类指定用于绘制文本的时候来描述字体的工具类。QFont可以看作是对系统上一个或多个字体的查询。

当我们创建QFont对象时,我们可以指定希望字体具有的各种属性。Qt将使用具有指定属性的字体,或者如果没有匹配的字体存在,Qt将使用最接近匹配的已安装字体。实际使用的字体属性可以从QFontInfo对象中检索。如果窗口系统提供精确匹配,则 exactMatch() 返回 true。使用 QFontMetricsF 来获得测量值,例如,使用 QFontMetrics::width() 来获得字符串的像素长度。

没有特别设置的属性不会影响字体选择算法,而会首选默认值。

要加载特定的物理字体(通常由单个文件表示),请使用QRawFont。

注意,在使用QFont之前,必须存在QGuiApplication实例。你可以使用QGuiApplication::setFont()设置应用程序的默认字体。

二、使用

如果选定的字体不包括需要显示的所有字符,QFont将尝试在最接近的等效字体中查找字符。当QPainter从一个字体中绘制一个字符时,QFont将报告它是否具有该字符;如果没有,QPainter将绘制一个未填充的正方形。

像这样创建QFonts:

  QFont serifFont("Times", 10, QFont::Bold);QFont sansFont("Helvetica [Cronyx]", 12);

在构造函数中设置的属性也可以稍后设置,例如 setFamily(), setPointSize(), setPointSizeF(), setWeight()和setItalic()。其余的属性必须在构造后设置,例如setBold(), setUnderline(), setOverline(), setStrikeOut()和setFixedPitch()

QFontInfo对象应该在设置字体属性之后创建。即使我们更改了字体的属性,QFontInfo对象也不会更改。

相应的“get”函数,例如 family(), pointSize() 等,返回设置的值,即使使用的值可能不同。实际值可以从QFontInfo对象中获得。

如果请求的字体族不可用,我们可以通过使用setStyleHint()选择特定的QFont::StyleHint和QFont::StyleStrategy来影响字体匹配算法。默认族(对应于当前样式提示)由defaultFamily()返回。

我们可以使用insertSubstitution()和insertSubstitutions()为字体族名称提供替换。可以使用removesubsutions()删除替换。使用substitute()来检索家族的第一个替代品,如果没有替代品,则检索家族名称本身。使用substitute()来检索一个家族的替代品列表(可以是空的)。

每个QFont都有一个key(),我们可以使用它作为缓存或字典中的键。如果希望存储用户的字体首选项,可以使用QSettings,用toString()写入字体信息,然后用fromString()读取。operator<<()和operator>>()函数也可用,但它们在数据流上工作。

可以使用setPixelSize()将屏幕上显示的字符的高度设置为指定的像素数;然而,使用setPointSize()具有类似的效果,并提供设备独立性。

加载字体可能会很消耗资源,尤其是在X11上。QFont包含广泛的优化,使QFont对象的复制快速,并缓存它所依赖的缓慢的窗口系统函数的结果。

三、字体匹配算法

字体匹配算法工作原理如下:

  • 搜索指定的字体族(由setFamilies()设置)。
  • 如果没有找到,那么如果指定的字体族存在并且可以用来表示正在使用的书写系统,它将被选中。
  • 如果不支持,则选择支持书写系统的替代字体。字体匹配算法将尝试为QFont中设置的所有属性找到最佳匹配。如何做到这一点因平台而异。
  • 如果系统中不存在支持该文本的字体,那么将在其位置显示特殊的“缺失字符”框。

注意:如果选择的字体,虽然支持一般的书写系统,但缺少一个或多个特定字符的字形,那么Qt将尝试为这个或这些特定字符找到一个备用字体。此功能可以使用QFont:: nofontmerge样式策略禁用。

在Windows中,对“Courier”字体的请求会自动更改为“Courier New”,这是Courier的改进版本,允许平滑缩放。旧的“Courier”位图字体可以通过设置PreferBitmap样式策略来选择(参见setStyleStrategy())。

一旦找到一个字体,剩下的属性将按照优先级的顺序进行匹配:

  • fixedPitch()
  • pointSize() (see below)
  • weight()
  • style()

如果你有一个匹配family的字体,即使其他属性都不匹配,这个字体也会优先选择一个不匹配family但匹配其他属性的字体。这是因为字体系列是主要的搜索条件。

如果点大小在请求点大小的20%以内,则定义为匹配。当几个字体匹配并且仅通过点大小区分时,将选择与请求的点大小最接近的字体。

用于绘制文本的实际字体、字体大小、粗细和其他字体属性将取决于窗口系统下所选字体的可用性。QFontInfo对象可用于确定用于绘制文本的实际值。

例子:

  QFont f("Helvetica");

如果你同时拥有Adobe和Cronyx Helvetica字体,你可能会得到任何一个。

  QFont f("Helvetica [Cronyx]");

我们可以在字体名称中指定我们想要的。上面例子中的字体 f 将被设置为“Helvetica [Cronyx]”。

要确定窗口系统中实际使用的字体的属性,可以使用QFontInfo对象,例如:

  QFontInfo info(f1);QString family = info.family();

要查找字体度量,请使用QFontMetrics对象,例如:

  QFontMetrics fm(f1);int textWidthInPixels = fm.horizontalAdvance("How many pixels wide is this text?");int textHeightInPixels = fm.height();

这篇关于Qt扫盲-QFont理论总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/334956

相关文章

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

基于Qt实现系统主题感知功能

《基于Qt实现系统主题感知功能》在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观,Qt作为一个跨平台的C++图形用... 目录【正文开始】一、使用效果二、系统主题感知助手类(SystemThemeHelper)三、实现细节