QSyntaxHighlighter Class

Mit der Klasse QSyntaxHighlighter können Sie Regeln für die Syntaxhervorhebung definieren. Außerdem können Sie die Klasse verwenden, um die aktuelle Formatierung eines Dokuments oder Benutzerdaten abzufragen. Mehr...

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

Hinweis: Alle Funktionen in dieser Klasse sind reentrant.

Öffentliche Funktionen

QSyntaxHighlighter(QObject *parent)
QSyntaxHighlighter(QTextDocument *parent)
virtual ~QSyntaxHighlighter()
QTextDocument *document() const
void setDocument(QTextDocument *doc)

Öffentliche Slots

void rehighlight()
void rehighlightBlock(const QTextBlock &block)

Geschützte Funktionen

QTextBlock currentBlock() const
int currentBlockState() const
QTextBlockUserData *currentBlockUserData() const
QTextCharFormat format(int position) const
virtual void highlightBlock(const QString &text) = 0
int previousBlockState() const
void setCurrentBlockState(int newState)
void setCurrentBlockUserData(QTextBlockUserData *data)
void setFormat(int start, int count, const QTextCharFormat &format)
void setFormat(int start, int count, const QColor &color)
void setFormat(int start, int count, const QFont &font)

Detaillierte Beschreibung

Die Klasse QSyntaxHighlighter ist eine Basisklasse für die Implementierung von QTextDocument Syntax-Highlightern. Ein Syntax-Highlighter hebt automatisch Teile des Textes in einem QTextDocument hervor. Syntax-Highlighter werden oft verwendet, wenn der Benutzer Text in einem bestimmten Format (z.B. Quellcode) eingibt und helfen dem Benutzer, den Text zu lesen und Syntaxfehler zu erkennen.

Um Ihre eigene Syntaxhervorhebung bereitzustellen, müssen Sie die Unterklasse QSyntaxHighlighter und highlightBlock() reimplementieren.

Wenn Sie eine Instanz Ihrer QSyntaxHighlighter-Unterklasse erstellen, übergeben Sie ihr die QTextDocument, auf die die Syntaxhervorhebung angewendet werden soll. Zum Beispiel:

QTextEdit *editor = new QTextEdit;
MyHighlighter *highlighter = new MyHighlighter(editor->document());

Danach wird Ihre highlightBlock() Funktion automatisch aufgerufen, wann immer es nötig ist. Verwenden Sie Ihre highlightBlock()-Funktion, um den übergebenen Text zu formatieren (z.B. Schriftart und Farbe). QSyntaxHighlighter bietet die Funktion setFormat(), die eine bestimmte QTextCharFormat auf den aktuellen Textblock anwendet. Zum Beispiel:

void MyHighlighter::highlightBlock(const QString &text)
{
    QTextCharFormat myClassFormat;
    myClassFormat.setFontWeight(QFont::Bold);
    myClassFormat.setForeground(Qt::darkMagenta);

    QRegularExpression expression("\\bMy[A-Za-z]+\\b");
    QRegularExpressionMatchIterator i = expression.globalMatch(text);
    while (i.hasNext()) {
        QRegularExpressionMatch match = i.next();
        setFormat(match.capturedStart(), match.capturedLength(), myClassFormat);
    }
}

Einige Syntaxen können Konstrukte haben, die sich über mehrere Textblöcke erstrecken. Zum Beispiel sollte ein C++ Syntax-Highlighter in der Lage sein, mit /*...* / mehrzeiligen Kommentaren umzugehen. Um mit diesen Fällen umzugehen, ist es notwendig, den Endzustand des vorherigen Textblocks zu kennen (z.B. "in comment").

Innerhalb Ihrer highlightBlock()-Implementierung können Sie den Endstatus des vorherigen Textblocks mit der Funktion previousBlockState() abfragen. Nach dem Parsen des Blocks können Sie den letzten Zustand mit setCurrentBlockState() speichern.

Die Funktionen currentBlockState() und previousBlockState() geben einen int-Wert zurück. Wenn kein Status gesetzt ist, ist der zurückgegebene Wert -1. Mit der Funktion setCurrentBlockState() können Sie einen beliebigen anderen Wert zur Kennzeichnung eines bestimmten Zustands angeben. Sobald der Status gesetzt ist, behält QTextBlock diesen Wert, bis er erneut gesetzt wird oder bis der entsprechende Textabschnitt gelöscht wird.

Wenn Sie z. B. einen einfachen C++-Syntax-Highlighter schreiben, könnten Sie 1 als Zeichen für "in comment" angeben:

QTextCharFormat multiLineCommentFormat;
multiLineCommentFormat.setForeground(Qt::red);

QRegularExpression startExpression("/\\*");
QRegularExpression endExpression("\\*/");

setCurrentBlockState(0);

int startIndex = 0;
if (previousBlockState() != 1)
    startIndex = text.indexOf(startExpression);

while (startIndex >= 0) {
    QRegularExpressionMatch endMatch;
    int endIndex = text.indexOf(endExpression, startIndex, &endMatch);
    int commentLength;
    if (endIndex == -1) {
        setCurrentBlockState(1);
        commentLength = text.length() - startIndex;
    } else {
        commentLength = endIndex - startIndex
                        + endMatch.capturedLength();
    }
    setFormat(startIndex, commentLength, multiLineCommentFormat);
    startIndex = text.indexOf(startExpression,
                              startIndex + commentLength);
}

Im obigen Beispiel setzen wir zunächst den aktuellen Blockstatus auf 0. Wenn der vorherige Block innerhalb eines Kommentars endete, markieren wir dann den Anfang des aktuellen Blocks (startIndex = 0). Andernfalls wird nach dem angegebenen Startausdruck gesucht. Wenn der angegebene Endausdruck im Textblock nicht gefunden wird, ändern wir den aktuellen Blockstatus, indem wir setCurrentBlockState() aufrufen, und stellen sicher, dass der Rest des Blocks hervorgehoben wird.

Darüber hinaus können Sie die aktuelle Formatierung und die Benutzerdaten mit den Funktionen format() bzw. currentBlockUserData() abfragen. Mit der Funktion setCurrentBlockUserData() können Sie auch Benutzerdaten an den aktuellen Textblock anhängen. QTextBlockUserData kann verwendet werden, um benutzerdefinierte Einstellungen zu speichern. Im Falle der Syntaxhervorhebung ist sie insbesondere als Zwischenspeicher für Informationen interessant, die Sie beim Parsen des Absatzes herausfinden können. Ein Beispiel finden Sie in der Dokumentation setCurrentBlockUserData().

Siehe auch QTextDocument und Syntax-Highlighter-Beispiel.

Dokumentation der Mitgliedsfunktionen

[explicit] QSyntaxHighlighter::QSyntaxHighlighter(QObject *parent)

Konstruiert einen QSyntaxHighlighter mit dem angegebenen parent.

Wenn der Elternteil ein QTextEdit ist, wird der Syntax-Highlighter auf dem Elterndokument installiert. Die angegebene QTextEdit wird auch der Besitzer des QSyntaxHighlighters.

[explicit] QSyntaxHighlighter::QSyntaxHighlighter(QTextDocument *parent)

Konstruiert einen QSyntaxHighlighter und installiert ihn auf parent. Der angegebene QTextDocument wird auch Eigentümer des QSyntaxHighlighters.

[virtual noexcept] QSyntaxHighlighter::~QSyntaxHighlighter()

Destruktor. Deinstalliert diesen Syntax-Highlighter aus dem Textdokument.

[protected] QTextBlock QSyntaxHighlighter::currentBlock() const

Gibt den aktuellen Textblock zurück.

[protected] int QSyntaxHighlighter::currentBlockState() const

Gibt den Zustand des aktuellen Textblocks zurück. Wird kein Wert gesetzt, ist der Rückgabewert -1.

Siehe auch setCurrentBlockState().

[protected] QTextBlockUserData *QSyntaxHighlighter::currentBlockUserData() const

Gibt das Objekt QTextBlockUserData zurück, das zuvor an den aktuellen Textblock angehängt war.

Siehe auch QTextBlock::userData() und setCurrentBlockUserData().

QTextDocument *QSyntaxHighlighter::document() const

Gibt die QTextDocument zurück, auf der dieser Syntax-Highlighter installiert ist.

Siehe auch setDocument().

[protected] QTextCharFormat QSyntaxHighlighter::format(int position) const

Gibt das Format unter position innerhalb des aktuellen Textblocks des Syntax-Highlighters zurück.

Siehe auch setFormat().

[pure virtual protected] void QSyntaxHighlighter::highlightBlock(const QString &text)

Hebt den angegebenen Textblock hervor. Diese Funktion wird bei Bedarf von der Rich-Text-Engine aufgerufen, d.h. bei Textblöcken, die sich geändert haben.

Um Ihre eigene Syntaxhervorhebung bereitzustellen, müssen Sie die Unterklasse QSyntaxHighlighter verwenden und highlightBlock() neu implementieren. In Ihrer Neuimplementierung sollten Sie die text des Blocks analysieren und setFormat() so oft wie nötig aufrufen, um die von Ihnen benötigten Schrift- und Farbänderungen vorzunehmen. Zum Beispiel:

void MyHighlighter::highlightBlock(const QString &text)
{
    QTextCharFormat myClassFormat;
    myClassFormat.setFontWeight(QFont::Bold);
    myClassFormat.setForeground(Qt::darkMagenta);

    QRegularExpression expression("\\bMy[A-Za-z]+\\b");
    QRegularExpressionMatchIterator i = expression.globalMatch(text);
    while (i.hasNext()) {
        QRegularExpressionMatch match = i.next();
        setFormat(match.capturedStart(), match.capturedLength(), myClassFormat);
    }
}

Siehe Detailed Description für Beispiele zur Verwendung von setCurrentBlockState(), currentBlockState() und previousBlockState(), um Syntaxen mit Konstrukten zu behandeln, die sich über mehrere Textblöcke erstrecken.

Siehe auch previousBlockState(), setFormat(), und setCurrentBlockState().

[protected] int QSyntaxHighlighter::previousBlockState() const

Gibt den Endzustand des Textblocks zurück, der vor dem aktuellen Block des Syntax-Highlighters liegt. Wurde zuvor kein Wert gesetzt, ist der Rückgabewert -1.

Siehe auch highlightBlock() und setCurrentBlockState().

[slot] void QSyntaxHighlighter::rehighlight()

Wendet die Hervorhebung erneut auf das gesamte Dokument an.

Siehe auch rehighlightBlock().

[slot] void QSyntaxHighlighter::rehighlightBlock(const QTextBlock &block)

Wendet die Hervorhebung auf die angegebene QTextBlock block an.

Siehe auch rehighlight().

[protected] void QSyntaxHighlighter::setCurrentBlockState(int newState)

Setzt den Status des aktuellen Textblocks auf newState.

Siehe auch currentBlockState() und highlightBlock().

[protected] void QSyntaxHighlighter::setCurrentBlockUserData(QTextBlockUserData *data)

Hängt das angegebene data an den aktuellen Textblock an. Der Besitz wird an das zugrundeliegende Textdokument übergeben, d.h. das angegebene QTextBlockUserData Objekt wird gelöscht, wenn der entsprechende Textblock gelöscht wird.

QTextBlockUserData kann verwendet werden, um eigene Einstellungen zu speichern. Im Falle der Syntaxhervorhebung ist es insbesondere als Zwischenspeicher für Informationen interessant, die man beim Parsen des Absatzes herausfinden kann.

Beispielsweise können Sie während des Parsens des Textes die Klammerzeichen, auf die Sie stoßen ('{[(' und dergleichen), im Auge behalten und ihre relative Position und die tatsächliche QChar in einer einfachen Klasse speichern, die von QTextBlockUserData abgeleitet ist:

struct ParenthesisInfo
{
    QChar character;
    int position;
};

struct BlockData : public QTextBlockUserData
{
    QList<ParenthesisInfo> parentheses;
};

Während der Cursornavigation im zugehörigen Editor können Sie das aktuelle QTextBlock (das mit der Funktion QTextCursor::block() abgerufen wird) fragen, ob es ein Benutzerdatenobjekt enthält, und es in Ihr BlockData -Objekt umwandeln. Dann können Sie prüfen, ob die aktuelle Cursorposition mit einer zuvor aufgezeichneten Klammerposition übereinstimmt, und je nach Art der Klammer (öffnend oder schließend) die nächste öffnende oder schließende Klammer auf derselben Ebene finden.

Auf diese Weise können Sie einen visuellen Klammerabgleich durchführen und von der aktuellen Cursorposition bis zur passenden Klammer markieren. Das macht es einfacher, eine fehlende Klammer in Ihrem Code zu erkennen und die entsprechende öffnende/schließende Klammer zu finden, wenn Sie klammerintensiven Code bearbeiten.

Siehe auch currentBlockUserData() und QTextBlock::setUserData().

void QSyntaxHighlighter::setDocument(QTextDocument *doc)

Installiert den Syntax-Highlighter auf dem angegebenen QTextDocument doc . Ein QSyntaxHighlighter kann jeweils nur für ein Dokument verwendet werden.

Siehe auch document().

[protected] void QSyntaxHighlighter::setFormat(int start, int count, const QTextCharFormat &format)

Diese Funktion wird auf den aktuellen Textblock des Syntaxhervorhebers angewendet (d.h. den Text, der an die Funktion highlightBlock() übergeben wird).

Der angegebene format wird auf den Text ab der Position start für eine Länge von count Zeichen angewandt (wenn count gleich 0 ist, wird nichts getan). Die in format eingestellten Formatierungseigenschaften werden bei der Anzeige mit den direkt im Dokument gespeicherten Formatierungsinformationen zusammengeführt, wie sie z. B. zuvor mit den Funktionen von QTextCursor eingestellt wurden. Beachten Sie, dass das Dokument selbst durch das mit dieser Funktion gesetzte Format nicht verändert wird.

Siehe auch format() und highlightBlock().

[protected] void QSyntaxHighlighter::setFormat(int start, int count, const QColor &color)

Dies ist eine überladene Funktion.

Die angegebene color wird auf den aktuellen Textblock ab der Position start für eine Länge von count Zeichen angewendet.

Die anderen Attribute des aktuellen Textblocks, z. B. die Schriftart und die Hintergrundfarbe, werden auf die Standardwerte zurückgesetzt.

Siehe auch format() und highlightBlock().

[protected] void QSyntaxHighlighter::setFormat(int start, int count, const QFont &font)

Dies ist eine überladene Funktion.

Die angegebene font wird auf den aktuellen Textblock ab der Position start für eine Länge von count Zeichen angewendet.

Die anderen Attribute des aktuellen Textblocks, z. B. die Schriftart und die Hintergrundfarbe, werden auf die Standardwerte zurückgesetzt.

Siehe auch format() und highlightBlock().

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