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