您现在的位置是:首页 > 正文

QTextLine、QGlyphRun、QTextLayout

2024-01-30 20:45:43阅读 0

QGlyphRun

一、描述

此类提供对字体中内部字形的直接访问。在某些情况下,开发人员可以对特定字体中的字形绘制到屏幕上进行更低级的控制。

当Qt显示以Unicode编码的文本字符串时,它会将Unicode点转换为基于字体的字形索引列表和位置列表。QGlyphRun 提供了一个接口,用于获取屏幕上的文本所需的原始数据。它包含字形索引列表、每个字形的位置和字体。

QTextLayout::glyphRuns()、QTextFragment::glglyphRun() 可用于将unicode编码的文本转换为QGlyphRun 对象列表,QPainter::drawGlyphRun() 可用来绘制glyph。

二、类型成员

1、enum QGlyphRun::GlyphRunFlag:此枚举的标志可以改变字形运行在视觉布局中的呈现方式或行为。

  • Overline:字形显示上划线。
  • Underline:字形显示下划线。
  • StrikeOut:字形显示删除线。
  • RightToLeft:字形从右到左排序。
  • SplitLigure:字形拆分连字标志符号

三、成员函数

略。


QTextLine

一、描述

此类表示 QTextLayout 中的一行文本。此类对象通常由 QTextLayout::createLine()创建。

二、部分成员函数

1、qreal ascent()

     qreal descent()

     qreal height()

     qreal width()

     qreal x()

     qreal y()

     qreal leading()

如下图。

     QRectF rect()

文本的边界矩形。

    void setLeadingIncluded(bool included)

设置 height 是否包括 leading,默认为 false。leading 为负则被忽略。 

     qreal cursorToX(int *cursorPos, QTextLine::Edge edge = Leading)

     qreal cursorToX(int cursorPos, QTextLine::Edge edge = Leading)

将位置 cursorPos 转换为文本行范围内相应的x轴位置,但不会超出文本边界矩形。

     int xToCursor(qreal pos, QTextLine::CursorPosition cpos = CursorBetweenCharacters)

将文本行上x坐标pos转换为最近的匹配光标位置。

2、void draw(QPainter *painter, const QPointF &position)

在 position 上使用 painter 上绘制一行文本。

3、QList<QGlyphRun> glyphRuns(int from = -1, int length = -1)

返回由 from 和 length 定义的范围内的字符的所有字形索引和位置。

from 索引相对于包含 QTextLayout 的文本的开头,范围必须在函数 textStart() 和 textLength() 确定的 QTextLine 范围内。

如果 from 为负,则默认为 textStart(),如果 length 为负,则默认为 textLength()。

4、qreal horizontalAdvance()

返回一个水平距离:从其位置到下一个自然绘制文本的位置的距离。

可以使用它并排放置两行文本:将第二行文本的位置设置为第一行文本的此值。

5、bool isValid()

是否有效。

6、int lineNumber()

当前行在文本引擎中的位置,是第几行。

7、QRectF naturalTextRect()

返回行内文本所覆盖的矩形。与 rect() 相比,返回的是文本实际占用的矩形。

8、qreal naturalTextWidth()

返回文本所占行的宽度。与 width() 的关系与上面类似。

9、void setLineWidth(qreal width)

设置文本行的宽度。该行从其起始位置开始填充尽可能多的字符。

10、void setNumColumns(int numColumns)

设置文本行从其起始位置开始填充的字符数。如果文本不能拆分到 numColumns 个字符,则该行将被填充到下一个空格或文本末尾。

例如:设置40可足够填充2字符:

再设置每个文本行只填充1字符:

11、void setPosition(const QPointF &pos)

文本开始的位置。

12、int textLength()

文本行中字符个数。

13、int textStart()

当前文本行的开头的字符是 QTextLayout 字符串的第几个字符。


QTextLayout

一、描述

QTextLayout类用于布置和渲染文本,可用于纯文本和富文本。它提供了Unicode兼容的渲染、换行和光标定位处理等功能。

二、部分成员函数

1、void beginLayout() / void endLayout()

开始布局过程。

2、QRectF boundingRect()

包含布局中所有文本行的最小矩形。

3、void clearLayout()

清除布局中的文本行信息。这将使布局无效。

4、QTextLine createLine()

如果布局中有要插入的文本,则返回要布局的新文本行,否则返回无效的文本行。

5、void draw(QPainter *p, const QPointF &pos, const QList<QTextLayout::FormatRange> &selections = QList<FormatRange>(), const QRectF &clip = QRectF())

在pos指定的位置绘制整个布局。渲染的布局被剪裁在 clip 指定的矩形内。

6、void drawCursor(QPainter *painter, const QPointF &position, int cursorPosition, int width)

     void drawCursor(QPainter *painter, const QPointF &position, int cursorPosition)

在给定位置绘制文本光标。文本中的相应位置由 cursorPosition 指定。

7、QList<QGlyphRun> glyphRuns(int from = -1, int length = -1)

返回与此文本布局中从位置 from 开始的 length 个字符相对应的所有字形的字形索引和位置。

这是一个昂贵的函数,不应在时间敏感的上下文中调用。

如果 from 小于零,则将从布局中的第一个字符开始。如果 length 小于零,则将从开始位置开始跨越整个字符串。

8、bool isValidCursorPosition(int pos)

位置pos是否有效的光标位置。在Unicode上下文中,文本中的某些位置不是有效的光标位置。

9、QTextLine lineAt(int i)

文本布局中的第 i 个文本行。

10、int lineCount()

此文本布局中的文本行数。

11、QTextLine lineForTextPosition(int pos)

返回包含光标位置 pos 的文本行。

12、qreal maximumWidth()

布局可以扩展到的最大宽度,基本上是整个文本的宽度。此函数仅在完成布局后返回有效值。

      qreal minimumWidth()

布局所需的最小宽度。这是布局的最小不可分割子字符串的宽度。此函数仅在完成布局后返回有效值。

13、int preeditAreaPosition()

返回编辑前即将处理的文本布局中区域的位置。

      QString preeditAreaText()

返回编辑前插入到布局中的文本。

14、void setCacheEnabled(bool enable)

是否启用完整布局信息的缓存。QTextLayout 默认在调用 endLayou() 后会丢弃大部分布局信息,以减少内存消耗。但是,如果想在之后直接绘制布局文本,启用缓存可能会大大加快绘制速度。

网站文章

  • npm 启动报错 ERROR in [eslint] Failed to load plugin ‘vue‘ declared in ‘.eslintrc.js‘:

    npm 启动报错 ERROR in [eslint] Failed to load plugin ‘vue‘ declared in ‘.eslintrc.js‘:

    1.清缓存,删除node_modules 文件夹,删除package-lock.json ,然后执行npm install ---试了不好用。版本 由 node-v12.2.0-x64.msi 更新至 最新版本node-v20.3.1-x64.msi。2. 更新 node.js 版本 ---这个好用问题解决,下载 | Node.js 中文网。node 中文官网下载地址。

    2024-01-30 20:45:37
  • realuid、saveduid和effectiveuid

    Maurice J.Bach 的《The Design of The UNIX Operating System》一书中对这个问题的论述。。。p2277.6 THE USER ID OF A PROCESS内核会给每个进程关联两个和进程ID无关的用户ID,一个是真实用户ID,还有一个是有效用户ID或者称为setuid(set user ID)。真实用户ID用于标识由谁为正在运行的进程负责。有效用户

    2024-01-30 20:45:07
  • 离散傅里叶变换(DFT)/快速傅里叶变换(FFT)matlab

    matlab计算卷积例1x1(n)={2,1,1,2} x2(n)={1,-1,-1,1}两种方法1)直接用时域计算卷积2)x1(n)={2,1,1,2} x2(n)={1,-1,-1,1}分别dft...

    2024-01-30 20:45:02
  • asp.net MVC3之AJAX实现(json)

    1.建一个mvc3的项目,取名叫MVC3Test 2.修改About.cshtml,如下代码 About.cshtml About.cshtml@{ ViewBag.Title = &quot;About Us&quot;; } script type=&quot;text/javascr

    2024-01-30 20:44:56
  • STM32cubeIDE安装教程

    STM32cubeIDE安装教程

    STM32CubeIDE集成了STM32CubeMX的STM32配置与项目创建功能,以便提供一体化工具体验,并节省安装与开发时间。在通过所选板卡或示例选择一个空的STM32 MCU或MPU,或者预配置微控制器或微处理器之后,将创建项目并生成初始化代码。在开发过程的任何时间,用户均可返回外设或中间件的初始化和配置阶段,并重新生成初始化代码,期间不会影响用户代码。

    2024-01-30 20:44:28
  • 如何解决Form表单的重复提交

    以前在做居民信息管理系统时出现过一个非常严重的问题,在添加居民信息,每刷新一次就会数据库中就会重复提交一次。这个问题很让人头疼,正好最近有一次面试,也被提问到此问题了,故在网上搜了一些这方面的文章。供交流学习之用。  三种方案javascript ,设置一个变量,只允许提交一次。   var checkSubmitFlg = false;  funct

    2024-01-30 20:44:20
  • 往c盘复制文件时,总是拒绝访问

    往c盘复制文件时,总是拒绝访问

    win10如何获取管理员权限?在往c盘复制文件时,总是拒绝访问,请问该怎么办?20 分享 举报 6个回答 #热议#3分钟看懂!2019年个税年度汇算怎么算? 华硕服务 百度认证:华硕电脑(上海)官方帐号推荐于2017-12-11 关注 Windows 10操作系统中开启Administrator超级管理员账户方法步骤如下百: 1、在Win10左下角的开始图标上点击...

    2024-01-30 20:44:12
  • 基本排序(二)插入排序(直接插入、Shell、折半)

      插入排序是常见的内部排序之一。常见的插入排序包括直接插入排序、Shell排序、折半排序。本篇主要介绍这三个排序。  转载请注明出处——http://www.cnblogs.com/zrtqsk/p/3807611.html,谢谢!一、直接插入排序  直接插入排序大概是我们最容易理解的一类排序了。  1、原理  对于n个元素的记录。  第一趟  :  把第2个元素拿...

    2024-01-30 20:44:05
  • 学计算机大连海事和徐州矿大,全国211院校考研难度详细分析!这些名校都是沧海遗珠!...

    学计算机大连海事和徐州矿大,全国211院校考研难度详细分析!这些名校都是沧海遗珠!...

    原标题:全国211院校考研难度详细分析!这些名校都是沧海遗珠!很多考研人,都是为了提升自己的学历而来!梦想着考取名校,圆自己一个名校梦。这些院校,往往竞争十分惨烈,让很多同学“望而生畏,感觉头大”!今...

    2024-01-30 20:43:35
  • centOS控制台字体太小解决方法

    centOS控制台,注意,不是图像界面的终端,其实无论控制台还是终端都可行。我用的是centos6.9,字体是一个我觉得很棒的terminus。解决正常分辨率下控制台字体太小的问题。 控制台字体不大是...

    2024-01-30 20:43:29