Qt扫盲-QFont理论总结

2023-11-01 03:36
文章标签 总结 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/320192

相关文章

Qt之QMessageBox的具体使用

《Qt之QMessageBox的具体使用》本文介绍Qt中QMessageBox类的使用,用于弹出提示、警告、错误等模态对话框,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.简单介绍3.常见函数4.按钮类型(QMessage::StandardButton)5.分步骤实现弹窗6.总结1.引言

Qt中Qfile类的使用

《Qt中Qfile类的使用》很多应用程序都具备操作文件的能力,包括对文件进行写入和读取,创建和删除文件,本文主要介绍了Qt中Qfile类的使用,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.QFile文件操作3.演示示例3.1实验一3.2实验二【演示 QFile 读写二进制文件的过程】4.

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自