QTextLayout Class

Die Klasse QTextLayout wird für die Gestaltung und Darstellung von Text verwendet. Mehr...

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

Hinweis: Alle Funktionen in dieser Klasse sind reentrant.

Öffentliche Typen

struct FormatRange
enum CursorMode { SkipCharacters, SkipWords }
(since 6.5) enum GlyphRunRetrievalFlag { RetrieveGlyphIndexes, RetrieveGlyphPositions, RetrieveStringIndexes, RetrieveString, RetrieveAll }
flags GlyphRunRetrievalFlags

Öffentliche Funktionen

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

Detaillierte Beschreibung

QTextLayout bietet viele Funktionen, die von einer modernen Text-Layout-Engine erwartet werden, einschließlich Unicode-konformes Rendering, Zeilenumbruch und Handhabung der Cursorpositionierung. Sie kann auch geräteunabhängiges Layout erzeugen und darstellen, was für WYSIWYG-Anwendungen wichtig ist.

Die Klasse hat eine recht einfache API, und wenn Sie nicht vorhaben, Ihr eigenes Text-Rendering für ein spezielles Widget zu implementieren, werden Sie sie wahrscheinlich nicht direkt verwenden müssen.

QTextLayout kann sowohl mit einfachem Text als auch mit Rich Text verwendet werden.

QTextLayout kann verwendet werden, um eine Sequenz von QTextLine Instanzen mit gegebenen Breiten zu erstellen und kann sie unabhängig auf dem Bildschirm positionieren. Sobald das Layout fertig ist, können diese Zeilen mit einem Malgerät gezeichnet werden.

Der Text, der ausgegeben werden soll, kann im Konstruktor angegeben oder mit setText() festgelegt werden.

Das Layout kann als eine Folge von QTextLine Objekten betrachtet werden; verwenden Sie createLine(), um eine QTextLine Instanz zu erstellen, und lineAt() oder lineForTextPosition(), um die erstellten Zeilen abzurufen.

Hier ist ein Codeschnipsel, der die Layoutphase demonstriert:

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

Der Text kann dann durch Aufruf der Funktion draw() des Layouts gerendert werden:

QPainter painter(this);
textLayout.draw(&painter, QPoint(0, 0));

Es ist auch möglich, jede Zeile einzeln zu zeichnen, z. B. um die letzte Zeile, die in ein Widget passt, auszulassen:

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

Für eine bestimmte Position im Text können Sie mit isValidCursorPosition(), nextCursorPosition() und previousCursorPosition() eine gültige Cursorposition finden.

Das QTextLayout selbst kann mit setPosition() positioniert werden; es hat ein boundingRect(), und ein minimumWidth() und ein maximumWidth().

Siehe auch QStaticText.

Dokumentation der Mitgliedstypen

enum QTextLayout::CursorMode

KonstanteWert
QTextLayout::SkipCharacters0
QTextLayout::SkipWords1

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

GlyphRunRetrievalFlag gibt Flags an, die an die Funktionen glyphRuns() übergeben werden, um zu bestimmen, welche Eigenschaften des Layouts in den QGlyphRun Objekten zurückgegeben werden. Da jede Eigenschaft Speicher verbraucht und zusätzliche Zuweisungen erfordern kann, ist es eine gute Praxis, nur die Eigenschaften anzufordern, auf die Sie später zugreifen müssen.

KonstanteWertBeschreibung
QTextLayout::RetrieveGlyphIndexes0x1Ruft die Indizes in der Schrift ab, die den Glyphen entsprechen.
QTextLayout::RetrieveGlyphPositions0x2Ruft die relativen Positionen der Glyphen im Layout ab.
QTextLayout::RetrieveStringIndexes0x4Ruft die Indizes in der ursprünglichen Zeichenfolge ab, die den einzelnen Glyphen entsprechen.
QTextLayout::RetrieveString0x8Ruft die ursprüngliche Quellzeichenkette aus dem Layout ab.
QTextLayout::RetrieveAll0xffffRuft alle verfügbaren Eigenschaften des Layouts ab.

Dieses Enum wurde in Qt 6.5 eingeführt.

Der Typ GlyphRunRetrievalFlags ist ein Typedef für QFlags<GlyphRunRetrievalFlag>. Er speichert eine ODER-Kombination von GlyphRunRetrievalFlag-Werten.

Siehe auch glyphRuns() und QTextLine::glyphRuns().

Dokumentation der Mitgliedsfunktionen

QTextLayout::QTextLayout()

Konstruiert ein leeres Textlayout.

Siehe auch setText().

QTextLayout::QTextLayout(const QString &text)

Konstruiert ein Textlayout, um den angegebenen text zu gestalten.

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

Konstruiert ein Textlayout, um den angegebenen text mit dem angegebenen font zu gestalten.

Alle Metrik- und Layoutberechnungen werden in Bezug auf das Zeichengerät paintdevice durchgeführt. Wenn paintdevice gleich nullptr ist, werden die Berechnungen in Bildschirmmetrik durchgeführt.

[noexcept] QTextLayout::~QTextLayout()

Zerstört das Layout.

void QTextLayout::beginLayout()

Beginnt den Layoutprozess.

Warnung: Dadurch wird das Layout ungültig, so dass alle vorhandenen QTextLine Objekte, die auf den vorherigen Inhalt verweisen, verworfen werden sollten.

Siehe auch endLayout().

QRectF QTextLayout::boundingRect() const

Das kleinste Rechteck, das alle Linien des Layouts enthält.

bool QTextLayout::cacheEnabled() const

Gibt true zurück, wenn die vollständigen Layoutinformationen zwischengespeichert sind; andernfalls false.

Siehe auch setCacheEnabled().

void QTextLayout::clearFormats()

Löscht die Liste der vom Textlayout unterstützten Zusatzformate.

Siehe auch formats() und setFormats().

void QTextLayout::clearLayout()

Löscht die Zeileninformationen im Layout. Nach dem Aufruf dieser Funktion gibt lineCount() 0 zurück.

Warnung: Dies macht das Layout ungültig, so dass alle vorhandenen QTextLine Objekte, die sich auf den vorherigen Inhalt beziehen, verworfen werden sollten.

QTextLine QTextLayout::createLine()

Gibt eine neue Textzeile zurück, die angelegt werden soll, wenn es Text gibt, der in das Layout eingefügt werden soll; andernfalls wird eine ungültige Textzeile zurückgegeben.

Das Textlayout erzeugt ein neues Zeilenobjekt, das nach der letzten Zeile im Layout bzw. am Anfang beginnt, wenn das Layout leer ist. Das Layout unterhält einen internen Cursor, und jede Zeile wird ab der Cursorposition mit Text gefüllt, wenn die Funktion QTextLine::setLineWidth() aufgerufen wird.

Sobald QTextLine::setLineWidth() aufgerufen wird, kann eine neue Zeile erstellt und mit Text gefüllt werden. Durch Wiederholung dieses Vorgangs wird der gesamte im QTextLayout enthaltene Textblock ausgelegt. Wenn kein Text mehr in das Layout eingefügt werden kann, ist das zurückgegebene QTextLine nicht gültig (isValid() gibt false zurück).

Qt::CursorMoveStyle QTextLayout::cursorMoveStyle() const

Der Stil der Cursorbewegung dieser QTextLayout. Die Vorgabe ist Qt::LogicalMoveStyle.

Siehe auch setCursorMoveStyle().

void QTextLayout::draw(QPainter *p, const QPointF &pos, const QList<QTextLayout::FormatRange> &selections = QList<FormatRange>(), const QRectF &clip = QRectF()) const

Zeichnet das gesamte Layout auf dem Maler p an der durch pos angegebenen Position. Das gerenderte Layout enthält das angegebene selections und wird innerhalb des durch clip angegebenen Rechtecks beschnitten.

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

Zeichnet einen Textcursor mit dem aktuellen Stift und dem angegebenen width an der angegebenen position unter Verwendung des angegebenen painter. Die entsprechende Position innerhalb des Textes wird durch cursorPosition angegeben.

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

Dies ist eine überladene Funktion.

Zeichnet einen Textcursor mit dem aktuellen Stift an der angegebenen position unter Verwendung der angegebenen painter. Die entsprechende Position innerhalb des Textes wird durch cursorPosition angegeben.

void QTextLayout::endLayout()

Beendet den Layoutprozess.

Siehe auch beginLayout().

QFont QTextLayout::font() const

Gibt die aktuelle Schriftart zurück, die für das Layout verwendet wird, oder eine Standardschriftart, wenn keine eingestellt ist.

Siehe auch setFont().

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

Gibt die Liste der zusätzlichen Formate zurück, die vom Textlayout unterstützt werden.

Siehe auch setFormats() und clearFormats().

QList<QGlyphRun> QTextLayout::glyphRuns(int from = -1, int length = -1) const

Dies ist eine überladene Funktion.

Gibt die Glyphenindizes und -positionen für alle Glyphen zurück, die den Zeichen length entsprechen, beginnend an der Position from in diesem QTextLayout. Dies ist eine teure Funktion und sollte nicht in einem zeitkritischen Kontext aufgerufen werden.

Wenn from kleiner als Null ist, beginnt der Glyphenlauf mit dem ersten Zeichen im Layout. Wenn length kleiner als Null ist, wird die gesamte Zeichenkette ab der Startposition umspannt.

Hinweis: Dies entspricht dem Aufruf von glyphRuns(from, length, QTextLayout::GlyphRunRetrievalFlag::GlyphIndexes | QTextLayout::GlyphRunRetrievalFlag::GlyphPositions).

Siehe auch draw() und QPainter::drawGlyphRun().

[since 6.5] QList<QGlyphRun> QTextLayout::glyphRuns(int from, int length, QTextLayout::GlyphRunRetrievalFlags retrievalFlags) const

Dies ist eine überladene Funktion.

Gibt die Glyphenindizes und -positionen für alle Glyphen zurück, die den Zeichen length entsprechen, beginnend an der Position from in diesem QTextLayout. Dies ist eine teure Funktion und sollte nicht in einem zeitkritischen Kontext aufgerufen werden.

Wenn from kleiner als Null ist, beginnt der Glyphenlauf mit dem ersten Zeichen im Layout. Wenn length kleiner als Null ist, wird die gesamte Zeichenkette ab der Startposition umspannt.

retrievalFlags gibt an, welche Eigenschaften von QGlyphRun aus dem Layout abgerufen werden. Um Zuweisungen und Speicherverbrauch zu minimieren, sollte dies so eingestellt werden, dass nur die Eigenschaften enthalten sind, auf die Sie später zugreifen müssen.

Diese Funktion wurde in Qt 6.5 eingeführt.

Siehe auch draw() und QPainter::drawGlyphRun().

bool QTextLayout::isValidCursorPosition(int pos) const

Gibt true zurück, wenn die Position pos eine gültige Cursorposition ist.

In einem Unicode-Kontext sind einige Positionen im Text keine gültigen Cursorpositionen, weil die Position innerhalb eines Unicode-Surrogats oder eines Graphem-Clusters liegt.

Ein Graphem-Cluster ist eine Folge von zwei oder mehr Unicode-Zeichen, die eine unteilbare Einheit auf dem Bildschirm bilden. Zum Beispiel kann das lateinische Zeichen "Ä" in Unicode durch zwei Zeichen dargestellt werden, "A" (0x41) und die kombinierende Diärese (0x308). Ein Textcursor kann nur vor oder nach diesen beiden Zeichen positioniert werden, niemals dazwischen, da dies keinen Sinn ergeben würde. In indischen Sprachen bildet jede Silbe ein Graphem-Cluster.

int QTextLayout::leftCursorPosition(int oldPos) const

Gibt die Position des Cursors links von oldPos zurück. Sie ist abhängig von der visuellen Position der Zeichen nach der bidirektionalen Umordnung.

Siehe auch rightCursorPosition() und previousCursorPosition().

QTextLine QTextLayout::lineAt(int i) const

Gibt die i-te Zeile des Textes in diesem Textlayout zurück.

Siehe auch lineCount() und lineForTextPosition().

int QTextLayout::lineCount() const

Gibt die Anzahl der Zeilen in diesem Textlayout zurück.

Siehe auch lineAt().

QTextLine QTextLayout::lineForTextPosition(int pos) const

Gibt die Zeile zurück, die die durch pos angegebene Cursorposition enthält.

Siehe auch isValidCursorPosition() und lineAt().

qreal QTextLayout::maximumWidth() const

Die maximale Breite, auf die sich das Layout ausdehnen kann; dies ist im Wesentlichen die Breite des gesamten Textes.

Achtung! Diese Funktion gibt nur dann einen gültigen Wert zurück, wenn das Layout fertiggestellt ist.

Siehe auch minimumWidth().

qreal QTextLayout::minimumWidth() const

Die Mindestbreite, die das Layout benötigt. Dies ist die Breite der kleinsten nicht brechbaren Teilzeichenkette des Layouts.

Achtung! Diese Funktion gibt nur dann einen gültigen Wert zurück, wenn das Layout fertiggestellt wurde.

Siehe auch maximumWidth().

int QTextLayout::nextCursorPosition(int oldPos, QTextLayout::CursorMode mode = SkipCharacters) const

Gibt die nächste gültige Cursorposition nach oldPos zurück, die den angegebenen Cursor mode respektiert. Gibt den Wert von oldPos zurück, wenn oldPos keine gültige Cursorposition ist.

Siehe auch isValidCursorPosition() und previousCursorPosition().

QPointF QTextLayout::position() const

Die globale Position des Layouts. Sie ist unabhängig vom Begrenzungsrechteck und vom Layoutprozess.

Siehe auch setPosition().

int QTextLayout::preeditAreaPosition() const

Gibt die Position des Bereichs im Textlayout zurück, der vor der Bearbeitung bearbeitet wird.

Siehe auch preeditAreaText().

QString QTextLayout::preeditAreaText() const

Gibt den Text zurück, der in das Layout eingefügt wird, bevor die Bearbeitung erfolgt.

Siehe auch preeditAreaPosition().

int QTextLayout::previousCursorPosition(int oldPos, QTextLayout::CursorMode mode = SkipCharacters) const

Gibt die erste gültige Cursorposition vor oldPos zurück, die den angegebenen Cursor mode respektiert. Gibt den Wert von oldPos zurück, wenn oldPos keine gültige Cursorposition ist.

Siehe auch isValidCursorPosition() und nextCursorPosition().

int QTextLayout::rightCursorPosition(int oldPos) const

Gibt die Position des Cursors rechts von oldPos zurück. Sie ist abhängig von der visuellen Position der Zeichen nach der bidirektionalen Umordnung.

Siehe auch leftCursorPosition() und nextCursorPosition().

void QTextLayout::setCacheEnabled(bool enable)

Aktiviert die Zwischenspeicherung der gesamten Layoutinformationen, wenn enable wahr ist; andernfalls wird die Layoutzwischenspeicherung deaktiviert. Normalerweise wirft QTextLayout den größten Teil der Layoutinformationen nach einem Aufruf von endLayout() weg, um den Speicherverbrauch zu reduzieren. Wenn Sie jedoch den gelayouteten Text direkt danach zeichnen wollen, kann die Aktivierung der Zwischenspeicherung das Zeichnen erheblich beschleunigen.

Siehe auch cacheEnabled().

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

Legt den Stil für die Bewegung des visuellen Cursors auf den angegebenen style fest. Wenn das QTextLayout durch ein Dokument unterstützt wird, können Sie dies ignorieren und die Option in QTextDocument verwenden. Diese Option ist für Widgets wie QLineEdit oder benutzerdefinierte Widgets ohne QTextDocument. Der Standardwert ist Qt::LogicalMoveStyle.

Siehe auch cursorMoveStyle().

void QTextLayout::setFont(const QFont &font)

Setzt die Schriftart des Layouts auf die angegebene font. Das Layout wird ungültig und muss neu angelegt werden.

Siehe auch font().

void QTextLayout::setFormats(const QList<QTextLayout::FormatRange> &formats)

Setzt die zusätzlichen Formate, die vom Textlayout unterstützt werden, auf formats. Die Formate werden mit dem Text des Pre-Edit-Bereichs an der richtigen Stelle angewendet.

Siehe auch formats() und clearFormats().

void QTextLayout::setPosition(const QPointF &p)

Verschiebt das Textlayout zum Punkt p.

Siehe auch position().

void QTextLayout::setPreeditArea(int position, const QString &text)

Legt die position und text des Bereichs im Layout fest, der bearbeitet wird, bevor die Bearbeitung erfolgt. Das Layout wird ungültig und muss neu angelegt werden.

Siehe auch preeditAreaPosition() und preeditAreaText().

void QTextLayout::setText(const QString &string)

Setzt den Text des Layouts auf den angegebenen string. Das Layout wird ungültig und muss neu angelegt werden.

Beachten Sie, dass diese Methode keine Wirkung hat, wenn dieses QTextLayout als Teil eines QTextDocument verwendet wird.

Siehe auch text().

void QTextLayout::setTextOption(const QTextOption &option)

Setzt die Textoptionsstruktur, die den Layoutprozess steuert, auf die angegebene option.

Siehe auch textOption().

QString QTextLayout::text() const

Gibt den Text des Layouts zurück.

Siehe auch setText().

const QTextOption &QTextLayout::textOption() const

Gibt die aktuelle Textoption zurück, die zur Steuerung des Layout-Prozesses verwendet wird.

Siehe auch 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.