QTextLayout Class

QTextLayout 类用于布局和渲染文本。更多

Header: #include <QTextLayout>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui

注意:该类中的所有函数都是可重入的

公共类型

struct FormatRange
enum CursorMode { SkipCharacters, SkipWords }
(since 6.5) enum GlyphRunRetrievalFlag { RetrieveGlyphIndexes, RetrieveGlyphPositions, RetrieveStringIndexes, RetrieveString, RetrieveAll }
flags 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
QList<QGlyphRun> glyphRuns(int from = -1, int length = -1) const
(since 6.5) QList<QGlyphRun> glyphRuns(int from, int length, QTextLayout::GlyphRunRetrievalFlags retrievalFlags) 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

详细说明

QTextLayout 提供了现代文本布局引擎所需的许多功能,包括兼容 Unicode 的渲染、换行和光标定位处理。它还可以生成和呈现与设备无关的布局,这对于所见即所得的应用程序来说非常重要。

该类的应用程序接口级别较低,除非你打算为某些专门的 widget 实现自己的文本渲染,否则你可能不需要直接使用它。

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);
textLayout.draw(&painter, QPoint(0, 0));

也可以单独绘制每一行,例如绘制适合忽略的 widget 的最后一行:

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() 找到有效的光标位置。

QTextLayout 本身可以通过setPosition() 定位;它有一个boundingRect() 、一个minimumWidth() 和一个maximumWidth() 。

另请参阅 QStaticText

成员类型文档

enum QTextLayout::CursorMode

常数
QTextLayout::SkipCharacters0
QTextLayout::SkipWords1

[since 6.5] enum QTextLayout::GlyphRunRetrievalFlag
flags QTextLayout::GlyphRunRetrievalFlags

GlyphRunRetrievalFlag 用于指定传递给glyphRuns() 函数的标志,以确定在QGlyphRun 对象中返回布局的哪些属性。由于每个属性都会消耗内存,可能需要额外的分配,因此好的做法是只请求以后需要访问的属性。

常量说明
QTextLayout::RetrieveGlyphIndexes0x1读取字体中与字形相对应的索引。
QTextLayout::RetrieveGlyphPositions0x2读取布局中字形的相对位置。
QTextLayout::RetrieveStringIndexes0x4检索原始字符串中与每个字形相对应的索引。
QTextLayout::RetrieveString0x8从布局中检索原始源字符串。
QTextLayout::RetrieveAll0xffff读取布局的所有可用属性。

该枚举在 Qt 6.5 中引入。

GlyphRunRetrievalFlags 类型是QFlags<GlyphRunRetrievalFlag> 的类型定义。它存储 GlyphRunRetrievalFlag 值的 OR 组合。

另请参阅 glyphRuns() 和QTextLine::glyphRuns()。

成员函数文档

QTextLayout::QTextLayout()

构造一个空文本布局。

另请参阅 setText().

QTextLayout::QTextLayout(const QString &text)

构建文本布局,以布局给定的text

QTextLayout::QTextLayout(const QString &text, const QFont &font, const QPaintDevice *paintdevice = nullptr)

构建文本布局,以指定的font 布局给定的text

所有度量和布局计算都将以绘画设备paintdevice 为单位进行。如果paintdevicenullptr ,计算将以屏幕度量值进行。

[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

在画图器p 上按pos 指定的位置绘制整个布局。渲染的布局包括给定的selections ,并在clip 指定的矩形内剪切。

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

使用当前笔和指定的width 在给定的position 处使用指定的painter 绘制文本光标。文本中的相应位置由cursorPosition 指定。

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

这是一个重载函数。

使用指定的painter 在给定的position 处使用当前笔绘制文本光标。文本中的相应位置由cursorPosition 指定。

void QTextLayout::endLayout()

结束布局过程。

另请参见 beginLayout().

QFont QTextLayout::font() const

返回布局使用的当前字体,如果没有设置,则返回默认字体。

另请参阅 setFont()。

QList<QTextLayout::FormatRange> QTextLayout::formats() const

返回文本布局支持的其他格式列表。

另请参阅 setFormats() 和clearFormats()。

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()。

[since 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()。

bool QTextLayout::isValidCursorPosition(int pos) const

如果位置pos 是有效的光标位置,则返回true

在 Unicode 环境中,文本中的某些位置不是有效的光标位置,因为该位置位于 Unicode 代用字符或字符串内。

字符串是由两个或多个 Unicode 字符组成的序列,在屏幕上形成一个不可分割的实体。例如,拉丁字符 "Ä "在 Unicode 中可以由两个字符 "A"(0x41)和组合重读(0x308)来表示。文本光标只能在这两个字符之前或之后有效定位,而不能在这两个字符之间定位,因为这样做没有意义。在指示语言中,每个音节都构成一个词素组。

int QTextLayout::leftCursorPosition(int oldPos) const

返回光标在oldPos 左侧、旁边的位置。这取决于双向重新排序后字符的可视位置。

另请参阅 rightCursorPosition() 和previousCursorPosition()。

QTextLine QTextLayout::lineAt(int i) const

返回此文本布局中的i-th 行文本。

另请参阅 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 为 true,则启用缓存完整的布局信息;否则禁用布局缓存。通常,QTextLayout 在调用endLayout() 后会丢弃大部分布局信息,以减少内存消耗。不过,如果您想在调用后直接绘制已布局的文本,启用缓存可能会大大加快绘制速度。

另请参见 cacheEnabled()。

void QTextLayout::setCursorMoveStyle(Qt::CursorMoveStyle style)

将可视光标移动样式设置为给定的style 。如果QTextLayout 由文档支持,则可以忽略该选项,使用QTextDocument 中的选项,该选项适用于类似QLineEdit 的 widget 或没有QTextDocument 的自定义 widget。默认值为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)

设置布局中的positiontext 区域,该区域在编辑发生前被处理。布局将失效,必须重新布局。

另请参阅 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()。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.