QTextLayout类
QTextLayout类用于布局和渲染文本。更多信息...
头文件 | #include <QTextLayout> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
qmake | QT += gui |
- 所有成员列表,包括继承成员
- QTextLayout是富文本处理API的一部分。
注意:此类中的所有函数都是可重入的。
公开类型
结构 | FormatRange |
枚举 | CursorMode { SkipCharacters, SkipWords } |
(自6.5) 枚举 | GlyphRunRetrievalFlag { RetrieveGlyphIndexes, RetrieveGlyphPositions, RetrieveStringIndexes, RetrieveString, RetrieveAll } |
标志 | GlyphRunRetrievalFlags |
公开函数
QTextLayout() | |
QTextLayout(const QString &text) | |
QTextLayout(const QString &text, const QFont &font, const QPaintDevice *paintdevice = nullptr) | |
~QTextLayout() | |
void | beginLayout() |
QRectF | boundingRect() const |
bool | cacheEnabled() const |
void | clearFormats() |
void | clearLayout() |
QTextLine | createLine() |
Qt::CursorMoveStyle | cursorMoveStyle() const |
void | draw(QPainter *p, const QPointF &pos, const QList<QTextLayout::FormatRange> &selections = QList<FormatRange>(), const QRectF &clip = QRectF()) const |
void | drawCursor(QPainter *painter, const QPointF &position, int cursorPosition, int width) const |
void | drawCursor(QPainter *painter, const QPointF &position, int cursorPosition) const |
void | endLayout() |
QFont | font() const |
QList<QTextLayout::FormatRange> | formats() const |
(自6.5) QList<QGlyphRun> | glyphRuns(int from, int length, QTextLayout::GlyphRunRetrievalFlags retrievalFlags) const |
QList<QGlyphRun> | glyphRuns(int from = -1, int length = -1) const |
bool | isValidCursorPosition(int pos) const |
int | leftCursorPosition(int oldPos) const |
QTextLine | lineAt(int i) const |
int | lineCount() const |
QTextLine | lineForTextPosition(int pos) const |
qreal | maximumWidth() const |
qreal | minimumWidth() const |
int | nextCursorPosition(int oldPos, QTextLayout::CursorMode mode = SkipCharacters) const |
QPointF | position() const |
int | preeditAreaPosition() const |
QString | preeditAreaText() const |
int | previousCursorPosition(int oldPos, QTextLayout::CursorMode mode = SkipCharacters) const |
int | rightCursorPosition(int oldPos) const |
void | setCacheEnabled(bool enable) |
void | setCursorMoveStyle(Qt::CursorMoveStyle style) |
void | setFont(const QFont &font) |
void | setFormats(const QList<QTextLayout::FormatRange> &formats) |
void | setPosition(const QPointF &p) |
void | setPreeditArea(int position, const QString &text) |
void | setText(const QString &string) |
void | setTextOption(const QTextOption &option) |
QString | text() const |
const QTextOption & | textOption() const |
详细描述
它提供了现代文本布局引擎的许多期望特性,包括符合Unicode的渲染、换行和光标定位处理。它还可以生成和渲染设备无关的布局,这对于所见即所得(WYSIWYG)应用非常重要。
该类具有相对较低级别的API,除非你打算为某些专用小部件实现自己的文本渲染,否则你可能不需要直接使用它。
QTextLayout可以使用纯文本和富文本。
QTextLayout可用于创建一系列具有给定宽度的QTextLine实例,可以在屏幕上独立定位它们。一旦完成布局,这些线条就可以在一个绘图设备上绘制。
布局的文本可以通过构造函数提供,也可以通过setText()设置。
布局可以看作是一个QTextLine对象的序列;使用createLine()创建QTextLine实例,使用lineAt()或lineForTextPosition()检索创建的线条。
以下是一个演示布局阶段的代码片段
int leading = fontMetrics.leading(); qreal height = 0; textLayout.setCacheEnabled(true); textLayout.beginLayout(); while (true) { QTextLine line = textLayout.createLine(); if (!line.isValid()) break; line.setLineWidth(lineWidth); height += leading; line.setPosition(QPointF(0, height)); height += line.height(); } textLayout.endLayout();
然后,可以通过调用布局的draw()函数来渲染文本
也可以单独绘制每一行,例如为了绘制适合小部件的最后一行而省略显示
QPainter painter(this); QFontMetrics fontMetrics = painter.fontMetrics(); int lineSpacing = fontMetrics.lineSpacing(); int y = 0; QTextLayout textLayout(content, painter.font()); textLayout.beginLayout(); while (true) { QTextLine line = textLayout.createLine(); if (!line.isValid()) break; line.setLineWidth(width()); const int nextLineY = y + lineSpacing; if (height() >= nextLineY + lineSpacing) { line.draw(&painter, QPoint(0, y)); y = nextLineY; } else { const QString lastLine = content.mid(line.textStart()); const QString elidedLastLine = fontMetrics.elidedText(lastLine, Qt::ElideRight, width()); painter.drawText(QPoint(0, y + fontMetrics.ascent()), elidedLastLine); line = textLayout.createLine(); break; } } textLayout.endLayout();
对于文本中的某个位置,可以使用isValidCursorPosition()、nextCursorPosition()和previousCursorPosition()找到有效的光标位置。
可以调用setPosition()来定位QTextLayout本身;它有一个boundingRect(),以及minimumWidth()和maximumWidth()。
参阅QStaticText.
成员类型文档
枚举 QTextLayout::CursorMode
常量 | 值 |
---|---|
QTextLayout::SkipCharacters | 0 |
QTextLayout::SkipWords | 1 |
[自 6.5 版起]
enum QTextLayout::GlyphRunRetrievalFlag
标志 QTextLayout::GlyphRunRetrievalFlags
GlyphRunRetrievalFlag 用于指定传递给glyphRuns()的 flags,以确定布局的哪些属性在QGlyphRun对象中返回。由于每个属性都会消耗内存且可能需要额外的分配,因此请仅请求以后需要访问的属性。
常量 | 值 | 描述 |
---|---|---|
QTextLayout::RetrieveGlyphIndexes | 0x1 | 检索对应于符号的字体中的索引。 |
QTextLayout::RetrieveGlyphPositions | 0x2 | 检索布局中符号的相对位置。 |
QTextLayout::RetrieveStringIndexes | 0x4 | 检索与每个符号对应的原始字符串中的索引。 |
QTextLayout::RetrieveString | 0x8 | 从布局中检索原始源字符串。 |
QTextLayout::RetrieveAll | 0xffff | 检索布局的所有可用属性。 |
此枚举在 Qt 6.5 中引入。
GlyphRunRetrievalFlags 类型是 QFlags<GlyphRunRetrievalFlag> 的 typedef。它存储一个或组合的 GlyphRunRetrievalFlag 值。
另请参阅glyphRuns()以及QTextLine::glyphRuns。
成员函数文档
QTextLayout::QTextLayout()
构造一个空的文本布局。
另请参阅setText。
QTextLayout::QTextLayout(const QString &text)
将给定的文本布局。
QTextLayout::QTextLayout(const QString &text, const QFont &font, const QPaintDevice *paintdevice = nullptr)
使用指定的字体布局给定的文本。
所有的度量值和布局计算都将在 paintdevice(绘制设备)的范围内完成。如果 paintdevice 是 nullptr
,计算将在屏幕度量值下完成。
[noexcept]
QTextLayout::~QTextLayout()
销毁布局。
void QTextLayout::beginLayout()
开始布局过程。
警告:这会使布局无效,所以所有引用前内容的现有QTextLine对象都应现在丢弃。
另请参阅endLayout。
QRectF QTextLayout::boundingRect() const
包含布局中所有行的最小矩形。
bool QTextLayout::cacheEnabled() const
如果完整的布局信息已缓存,则返回true
;否则返回false
。
另请参阅 setCacheEnabled。
void QTextLayout::clearFormats()
清除文本布局支持的附加格式列表。
另请参阅 formats和setFormats。
void QTextLayout::clearLayout()
清除布局中的行信息。调用此函数后,lineCount()返回0。
警告:这会使布局无效,所以所有引用前内容的现有QTextLine对象都应现在丢弃。
QTextLine QTextLayout::createLine()
如果有文本要插入布局中,则返回一个新文本行进行布局;否则返回一个无效的文本行。
文本布局创建一个新的行对象,该对象位于布局中最后一行之后,或者为空布局时在开头。布局保持一个内部光标,并在调用QTextLine::setLineWidth()函数时,从光标位置开始填充每行文本。
一旦调用QTextLine::setLineWidth(),就可以创建一个新的行并填充文本。重复此过程将在QTextLayout中布局整个文本块。如果没有文本可插入布局,返回的QTextLine将无效(isValid()将返回false)。
Qt::CursorMoveStyle QTextLayout::cursorMoveStyle() const
此QTextLayout的移动光标样式。默认为Qt::LogicalMoveStyle。
另请参阅 setCursorMoveStyle。
void QTextLayout::draw(QPainter *p, const QPointF &pos, const QList<QTextLayout::FormatRange> &selections = QList<FormatRange>(), const QRectF &clip = QRectF()) const
在指定位置为 painter p 绘制整个布局。渲染的布局包括指定的selections,并在由clip指定的矩形内裁剪。
void QTextLayout::drawCursor(QPainter *painter, const QPointF &position, int cursorPosition, int width) const
使用指定的 painter painter 在指定位置position处绘制带有当前笔和指定width的文本光标。文本内的对应位置由$i translate="no">cursorPosition指定。
void QTextLayout::drawCursor(QPainter *painter, const QPointF &position, int cursorPosition) const
这是一个重载函数。
使用指定的 painter painter 在给定位置position处绘制带有当前笔的文本光标。文本内的对应位置由cursorPosition指定。
void QTextLayout::endLayout()
结束布局过程。
另请参阅 beginLayout()。
QFont QTextLayout::font() const
返回用于布局的当前字体,或者如果未设置则返回默认字体。
另请参阅 setFont()。
QList<QTextLayout::FormatRange> QTextLayout::formats() const
返回支持文本布局的额外格式列表。
另请参阅 setFormats() 和 clearFormats()。
[自 6.5 版起]
QList<QGlyphRun> QTextLayout::glyphRuns(int from, int length, QTextLayout::GlyphRunRetrievalFlags retrievalFlags) const
这是一个重载函数。
返回在此 QTextLayout 中从位置 from 开始的 length 个字符对应的所有字符形索引和位置。这是一个昂贵的函数,不应在时间敏感的上下文中调用。
如果 from 小于零,则字符运行将始于布局中的第一个字符。如果 length 小于零,则它将覆盖从起始位置到整个字符串。
retrievalFlags 指定将从中获取 QGlyphRun 的哪个属性。为了最小化分配和内存消耗,应将其设置为仅包含您稍后需要访问的属性。
此函数是在 Qt 6.5 版本中引入的。
另请参阅 draw() 和 QPainter::drawGlyphRun。
QList<QGlyphRun> QTextLayout::glyphRuns(int from = -1, int length = -1) const
这是一个重载函数。
返回在此 QTextLayout 中从位置 from 开始的 length 个字符对应的所有字符形索引和位置。这是一个昂贵的函数,不应在时间敏感的上下文中调用。
如果 from 小于零,则字符运行将始于布局中的第一个字符。如果 length 小于零,则它将覆盖从起始位置到整个字符串。
注意: 这等价于调用 glyphRuns(from, length, QTextLayout::GlyphRunRetrievalFlag::GlyphIndexes | QTextLayout::GlyphRunRetrievalFlag::GlyphPositions)。
另请参阅 draw() 和 QPainter::drawGlyphRun。
bool QTextLayout::isValidCursorPosition(int pos) const
如果位置 pos 是有效的光标位置,则返回 true
。
在 Unicode 上下文中,有些文本位置不是有效光标位置,因为这些位置位于 Unicode 代理或 grapheme 元素内部。
grapheme 元素是一系列由两个或更多 Unicode 字符形成的一个不可分割的实体。例如,拉丁字符 `Ä' 可以在 Unicode 中用两个字符表示,`A' (0x41) 和组合变音符号 (0x308)。文本光标只能有效地定位在这两个字符之前或之后,而不能在它们之间,因为这在逻辑上是不合理的。在印度语系语言中,每个音节都是一个 grapheme 元素。
int QTextLayout::leftCursorPosition(int oldPos) const
返回位于 oldPos 左侧的光标位置,紧挨着它。它依赖于字符的视觉位置,在双向重新排序之后。
另请参阅 rightCursorPosition() 和 previousCursorPosition。
QTextLine QTextLayout::lineAt(int i) const
返回此文本布局中的第 i 行文本。
另请参阅 lineCount() 和 lineForTextPosition。
int QTextLayout::lineCount() const
返回此文本布局中的行数。
另请参阅 lineAt。
QTextLine QTextLayout::lineForTextPosition(int pos) const
返回包含由 pos 指定的光标位置的行。
另请参阅 isValidCursorPosition() 和 lineAt。
qreal QTextLayout::maximumWidth() const
布局可以扩展到的最大宽度;这基本上是整个文本的宽度。
注意:此函数只能在布局完成后返回有效值。
另请参阅 minimumWidth。
qreal QTextLayout::minimumWidth() const
布局所需要的最小宽度。这是布局中最小不可断行字符串的宽度。
注意:此函数只能在布局完成后返回有效值。
另请参阅 maximumWidth。
int QTextLayout::nextCursorPosition(int oldPos, QTextLayout::CursorMode mode = SkipCharacters) const
返回在 oldPos 之后的下一个有效光标位置,该位置符合给定的光标 mode。如果 oldPos 不是一个有效的光标位置,则返回 oldPos 的值。
另请参阅 isValidCursorPosition() 和 previousCursorPosition。
QPointF QTextLayout::position() const
布局的全局位置。这是独立于边界矩形和布局过程的。
另请参阅 setPosition。
int QTextLayout::preeditAreaPosition() const
返回将要处理编辑前的文本布局中的区域位置。
另请参阅 preeditAreaText。
QString QTextLayout::preeditAreaText() const
返回编辑前插入布局中的文本。
另请参阅 preeditAreaPosition。
int QTextLayout::previousCursorPosition(int oldPos, QTextLayout::CursorMode mode = SkipCharacters) const
返回在 oldPos 之前的第一个有效光标位置,该位置符合给定的光标 mode。如果 oldPos 不是一个有效的光标位置,则返回 oldPos 的值。
另请参阅 isValidCursorPosition() 和 nextCursorPosition().
int QTextLayout::rightCursorPosition(int oldPos) const
返回 oldPos 右侧的指针位置,紧挨着它。它在双向排序后依赖于字符的视觉位置。
另请参阅 leftCursorPosition() 和 nextCursorPosition().
void QTextLayout::setCacheEnabled(bool enable)
如果 enable 为真,则启用完整布局信息的缓存;否则禁用布局缓存。通常 QTextLayout 在调用 endLayout() 后会丢弃大部分布局信息以减少内存消耗。如果您希望在布局文本后直接绘制,启用缓存可以显著提高绘图速度。
另请参阅 cacheEnabled().
void QTextLayout::setCursorMoveStyle(Qt::CursorMoveStyle style)
将视觉光标移动样式设置为给定的 style。如果 QTextLayout 由文档支持,则可以忽略此选项并使用 QTextDocument 中的选项,此选项适用于如 QLineEdit 或不带 QTextDocument 的自定义小部件。默认值为 Qt::LogicalMoveStyle。
另请参阅 cursorMoveStyle().
void QTextLayout::setFont(const QFont &font)
将布局的字体设置为给定的 font。布局将失效并必须重新进行布局。
另请参阅 font().
void QTextLayout::setFormats(const QList<QTextLayout::FormatRange> &formats)
将文本布局支持的增加格式设置为 formats。格式将在预编辑区域文本就位时应用。
另请参阅 formats() 和 clearFormats().
void QTextLayout::setPosition(const QPointF &p)
将文本布局移动到点 p。
另请参阅 position().
void QTextLayout::setPreeditArea(int position, const QString &text)
设置编辑发生之前在布局中处理的区域的 position 和 text。布局将失效并必须重新进行布局。
另请参阅 preeditAreaPosition() 和 preeditAreaText().
void QTextLayout::setText(const QString &string)
将布局的文本设置为给定的 string。布局将失效并必须重新进行布局。
注意,当把此QTextLayout作为QTextDocument的一部分使用时,该方法将不起作用。
另请参阅text().
void QTextLayout::setTextOption(const QTextOption &option)
将布局过程控制的文本选项结构设置为指定的option。
另请参阅textOption().
QString QTextLayout::text() const
返回布局的文本。
另请参阅setText。
const QTextOption &QTextLayout::textOption() const
返回当前用于控制布局过程的文本选项。
另请参阅setTextOption().
© 2024 Qt股份有限公司。此处包含的文档贡献属于其各自的拥有者。此处提供的文档是根据自由软件基金会发布的GNU自由文档许可协议版本1.3许可的。Qt及其相关标志是芬兰的Qt股份有限公司和/或其他国家的注册商标。所有其他商标均为其各自所有者的财产。