このページでは

QTextLayout Class

QTextLayout クラスは、テキストのレイアウトと描画に使用されます。詳細...

ヘッダー: #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

詳細な説明

このクラスは、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() を使用して、有効なカーソル位置を取得できます。

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> の typedef です。これは、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)

指定された `text ` を、指定された `font` に基づいて配置するためのテキストレイアウトを構築します。

すべてのメトリックおよびレイアウトの計算は、ペイントデバイスである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

レイアウト全体を、pos で指定された位置にあるペインターp に描画します。レンダリングされたレイアウトには、指定されたselections が含まれ、clip で指定された矩形内にクリップされます。

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

指定されたwidth と現在のペンを使用し、指定されたpainter に基づいて、指定されたposition にテキストカーソルを描画します。テキスト内の対応する位置は、cursorPosition で指定されます。

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

指定されたposition の位置に、指定されたpainter を使用して、現在のペンでテキストカーソルを描画します。テキスト内の対応する位置は、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 が0未満の場合、グリフランはレイアウトの最初の文字から始まります。length が0未満の場合、開始位置から文字列全体にわたってグリフランが形成されます。

注:これは 、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 が0未満の場合、グリフの連続はレイアウトの最初の文字から始まります。length が0未満の場合、開始位置から文字列全体に及びます。

retrievalFlags は、レイアウトからQGlyphRun のどのプロパティを取得するかを指定します。割り当てやメモリ消費を最小限に抑えるため、後でアクセスする必要があるプロパティのみを含めるように設定する必要があります。

これはオーバーロードされた関数です。

この関数は Qt 6.5 で導入されました。

draw() およびQPainter::drawGlyphRun()も参照してください 。

bool QTextLayout::isValidCursorPosition(int pos) const

位置pos が有効なカーソル位置である場合、true を返します。

Unicode の文脈では、テキスト内の位置の中には、Unicode サロゲートやグラフェムクラスタの内部にあるため、有効なカーソル位置ではないものがあります。

グラフエムクラスターとは、画面上で1つの分割不可能なエンティティを形成する、2つ以上のUnicode文字の連続のことです。例えば、ラテン文字の `Ä' は、Unicode では `A' (0x41) と結合ダイアレシス (0x308) の2つの文字で表されます。 テキストカーソルは、これら2つの文字の直前または直後にのみ有効に配置でき、その間には配置できません。その間への配置は意味をなさないためです。インド系言語では、すべての音節がグラフエムクラスターを形成します。

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

指定されたカーソルmode を満たす、oldPos 以前の最初の有効なカーソル位置を返します。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 のようなウィジェットや、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()も参照してください 。

© 2026 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.