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

相关文章

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 配合使用四、自

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

Qt把文件夹从A移动到B的实现示例

《Qt把文件夹从A移动到B的实现示例》本文主要介绍了Qt把文件夹从A移动到B的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录如何移动一个文件? 如何移动文件夹(包含里面的全部内容):如何删除文件夹:QT 文件复制,移动(

Python依赖库的几种离线安装方法总结

《Python依赖库的几种离线安装方法总结》:本文主要介绍如何在Python中使用pip工具进行依赖库的安装和管理,包括如何导出和导入依赖包列表、如何下载和安装单个或多个库包及其依赖,以及如何指定... 目录前言一、如何copy一个python环境二、如何下载一个包及其依赖并安装三、如何导出requirem