QTextLayout类

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

头文件 #include <QTextLayout>
CMakefind_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmakeQT += gui

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

公开类型

结构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()
voidbeginLayout()
QRectFboundingRect() const
boolcacheEnabled() const
voidclearFormats()
voidclearLayout()
QTextLinecreateLine()
Qt::CursorMoveStylecursorMoveStyle() const
voiddraw(QPainter *p, const QPointF &pos, const QList<QTextLayout::FormatRange> &selections = QList<FormatRange>(), const QRectF &clip = QRectF()) const
voiddrawCursor(QPainter *painter, const QPointF &position, int cursorPosition, int width) const
voiddrawCursor(QPainter *painter, const QPointF &position, int cursorPosition) const
voidendLayout()
QFontfont() 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
boolisValidCursorPosition(int pos) const
intleftCursorPosition(int oldPos) const
QTextLinelineAt(int i) const
intlineCount() const
QTextLinelineForTextPosition(int pos) const
qrealmaximumWidth() const
qrealminimumWidth() const
intnextCursorPosition(int oldPos, QTextLayout::CursorMode mode = SkipCharacters) const
QPointFposition() const
intpreeditAreaPosition() const
QStringpreeditAreaText() const
intpreviousCursorPosition(int oldPos, QTextLayout::CursorMode mode = SkipCharacters) const
intrightCursorPosition(int oldPos) const
voidsetCacheEnabled(bool enable)
voidsetCursorMoveStyle(Qt::CursorMoveStyle style)
voidsetFont(const QFont &font)
voidsetFormats(const QList<QTextLayout::FormatRange> &formats)
voidsetPosition(const QPointF &p)
voidsetPreeditArea(int position, const QString &text)
voidsetText(const QString &string)
voidsetTextOption(const QTextOption &option)
QStringtext() 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);
textLayout.draw(&painter, QPoint(0, 0));

也可以单独绘制每一行,例如为了绘制适合小部件的最后一行而省略显示

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::SkipCharacters0
QTextLayout::SkipWords1

[自 6.5 版起] enum QTextLayout::GlyphRunRetrievalFlag
标志 QTextLayout::GlyphRunRetrievalFlags

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

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

此枚举在 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(绘制设备)的范围内完成。如果 paintdevicenullptr,计算将在屏幕度量值下完成。

[noexcept] QTextLayout::~QTextLayout()

销毁布局。

void QTextLayout::beginLayout()

开始布局过程。

警告:这会使布局无效,所以所有引用前内容的现有QTextLine对象都应现在丢弃。

另请参阅endLayout

QRectF QTextLayout::boundingRect() const

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

bool QTextLayout::cacheEnabled() const

如果完整的布局信息已缓存,则返回true;否则返回false

另请参阅 setCacheEnabled

void QTextLayout::clearFormats()

清除文本布局支持的附加格式列表。

另请参阅 formatssetFormats

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)

设置编辑发生之前在布局中处理的区域的 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().

© 2024 Qt股份有限公司。此处包含的文档贡献属于其各自的拥有者。此处提供的文档是根据自由软件基金会发布的GNU自由文档许可协议版本1.3许可的。Qt及其相关标志是芬兰的Qt股份有限公司和/或其他国家的注册商标。所有其他商标均为其各自所有者的财产。