当前位置: 首页>开发笔记>正文

QTextLine、QGlyphRun、QTextLayout

QTextLine、QGlyphRun、QTextLayout

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() 后会丢弃大部分布局信息,以减少内存消耗。但是,如果想在之后直接绘制布局文本,启用缓存可能会大大加快绘制速度。

https://www.zydui.com/af6c1V28HAA4.html
>

相关文章:

  • vscode搭建nodejs環境,關于VS code ESP-IDF 提示“loading ‘build.ninja‘: 系統找不到指定的文件” 的解決方案
  • 什么是應用軟件并舉例,16.應用舉例
  • 【面經】美團春招三輪面經分享~涵蓋眾多知識點
  • 2021年面試題目,面試題--新增
  • magic king怎么讀,magick++ 簡介
  • 微信怎么設置定時發送,朋友圈可以定時發送嗎?
  • can not connect to rpc service,RPC service
  • ftpserver安卓版,FTPServer
  • server u使用教程,Server-U
  • rpc服務器,RPC 和 Web Service 有什么區別?
  • rpc服務器,web service和rpc的區別
  • psexec
  • dhclient命令,hpe?3par命令行查看狀況腳本
  • hp存儲默認管理口地址,HP3par 多路徑存儲磁盤使用方法
  • hp3par命令行手冊,3par命令集
  • 存儲器芯片的地址范圍,存儲器芯片類別有哪些?
  • 在pc機中各類存儲器,1.14各類存儲器芯片
  • 存儲芯片漲價最新消息,存儲器芯片
  • Windows/Linux性能監控軟件>csv文件,方便生成圖表
  • sqlserver nvarchar,【SQL開發實戰技巧】系列(四十五):Oracle12C常用新特性?VARCHAR2/NVARCHAR2類型最大長度由40
  • arcgis怎么導入地圖,Arcgis路網導入3dmax批量改成道路面
  • 定義animal父類,定義一個父類Animal eat方法 , 定義兩個子類 Dog 特有方法keepHome , Cat 特有方法 catchMouse ;并
  • 手機連接兩個藍牙方法,打開藍牙的設置
  • iconfont圖標免費嗎,關于阿里矢量圖標彩色icon使用
  • ps制作賽博朋克風格,如何用ps做出賽博朋克的風格?
  • ue4綠幕實時導入場景,如何在UE4中制作賽博朋克LED效果
  • 產品經理有哪些培訓課程,2023年全國NPDP產品經理國際認證火熱招生啦
  • B端產品需要什么能力,NPDP認證|B端產品經理是如何做競品調研的?
  • 超級工具,Supershell 一款牛叉閃閃的工具
  • buffer在c語言中是什么意思,QBuffer 用法理解