QSyntaxHighlighter Class
Mit der Klasse „QSyntaxHighlighter“ können Sie Regeln für die Syntaxhervorhebung definieren und darüber hinaus die aktuelle Formatierung oder Benutzerdaten eines Dokuments abfragen. Mehr...
| Kopfzeile: | #include <QSyntaxHighlighter> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
| qmake: | QT += gui |
| Erbt von: | QObject |
- Liste aller Mitglieder, einschließlich geerbter Mitglieder
- QSyntaxHighlighter ist Teil der Rich-Text-Verarbeitungs-APIs.
Hinweis: Alle Funktionen 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) |
Ausführliche Beschreibung
Die Klasse „QSyntaxHighlighter“ ist eine Basisklasse zur Implementierung von Syntaxhervorhebern für „ QTextDocument “. Ein Syntaxhervorheber hebt automatisch Teile des Textes in einem „ QTextDocument “ hervor. Syntaxhervorheber werden häufig 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 eine eigene Syntaxhervorhebung bereitzustellen, müssen Sie eine Unterklasse von `QSyntaxHighlighter` erstellen und die Methode ` highlightBlock()` neu implementieren.
Wenn Sie eine Instanz Ihrer QSyntaxHighlighter-Unterklasse erstellen, übergeben Sie ihr den ` QTextDocument `, auf den die Syntaxhervorhebung angewendet werden soll. Zum Beispiel:
QTextEdit *editor = new QTextEdit;
MyHighlighter *highlighter = new MyHighlighter(editor->document());Danach wird Ihre Funktion ` highlightBlock()` bei Bedarf automatisch aufgerufen. Verwenden Sie Ihre Funktion ` highlightBlock()``, um den an sie übergebenen Text zu formatieren (z. B. Schriftart und Farbe festlegen). `QSyntaxHighlighter` stellt die Funktion ` setFormat()` zur Verfügung, die eine angegebene ` QTextCharFormat ` auf den aktuellen Textblock anwendet. 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);
}
}Manche Syntaxen können Konstrukte enthalten, die sich über mehrere Textblöcke erstrecken. Ein C++-Syntax-Highlighter sollte beispielsweise in der Lage sein, mehrzeilige Kommentare wie /*...* / zu verarbeiten. Um diese Fälle zu bewältigen, muss der Endzustand des vorherigen Textblocks bekannt sein (z. B. „im Kommentar“).
Innerhalb Ihrer Implementierung von ` highlightBlock()` können Sie den Endzustand des vorherigen Textblocks mithilfe 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. Ist kein Status festgelegt, lautet der Rückgabewert -1. Mit der Funktion ` setCurrentBlockState()` können Sie einen beliebigen anderen Wert festlegen, um einen bestimmten Status zu kennzeichnen. Sobald der Status festgelegt ist, behält die ` QTextBlock ` diesen Wert bei, bis er erneut festgelegt wird oder bis der entsprechende Textabsatz gelöscht wird.
Wenn Sie beispielsweise einen einfachen C++-Syntax-Highlighter schreiben, könnten Sie den Wert 1 festlegen, um „im Kommentar“ zu kennzeichnen:
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 Blockzustand auf 0. Wenn der vorherige Block innerhalb eines Kommentars endete, markieren wir dann ab dem Anfang des aktuellen Blocks (startIndex = 0). Andernfalls suchen wir nach dem angegebenen Startausdruck. Kann der angegebene Endausdruck im Textblock nicht gefunden werden, ändern wir den aktuellen Blockstatus durch Aufruf von ` setCurrentBlockState()` und stellen sicher, dass der Rest des Blocks hervorgehoben wird.
Darüber hinaus können Sie die aktuelle Formatierung und Benutzerdaten mithilfe der Funktionen „ format()“ bzw. „ currentBlockUserData()“ abfragen. Sie können dem aktuellen Textblock auch Benutzerdaten mit der Funktion ` setCurrentBlockUserData()` hinzufügen. Mit ` QTextBlockUserData ` lassen sich benutzerdefinierte Einstellungen speichern. Im Falle der Syntaxhervorhebung ist dies insbesondere als Cache-Speicher für Informationen interessant, die Sie möglicherweise beim Parsen des Absatztextes ermitteln. Ein Beispiel finden Sie in der Dokumentation zu ` setCurrentBlockUserData()`.
Siehe auch „ QTextDocument “ und „Beispiel für den Syntax-Highlighter“.
Dokumentation zu Mitgliedsfunktionen
[explicit] QSyntaxHighlighter::QSyntaxHighlighter(QObject *parent)
Erstellt einen QSyntaxHighlighter mit dem angegebenen „ parent “.
Ist das übergeordnete Element ein ` QTextEdit`, wird der Syntax-Highlighter im Dokument des übergeordneten Elements installiert. Das angegebene ` QTextEdit ` wird zudem zum Eigentümer des `QSyntaxHighlighter`.
[explicit] QSyntaxHighlighter::QSyntaxHighlighter(QTextDocument *parent)
Erstellt einen QSyntaxHighlighter und fügt ihn unter parent ein. Die angegebene QTextDocument wird zudem zum Eigentümer des QSyntaxHighlighter.
[virtual noexcept] QSyntaxHighlighter::~QSyntaxHighlighter()
Destruktor. Entfernt diesen Syntax-Highlighter aus dem Textdokument.
[protected] QTextBlock QSyntaxHighlighter::currentBlock() const
Gibt den aktuellen Textblock zurück.
[protected] int QSyntaxHighlighter::currentBlockState() const
Gibt den Status des aktuellen Textblocks zurück. Wenn kein Wert festgelegt ist, beträgt der Rückgabewert -1.
Siehe auch „ setCurrentBlockState()“.
[protected] QTextBlockUserData *QSyntaxHighlighter::currentBlockUserData() const
Gibt das QTextBlockUserData -Objekt 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)
Markiert den angegebenen Textblock. Diese Funktion wird bei Bedarf von der Rich-Text-Engine aufgerufen, d. h. bei Textblöcken, die sich geändert haben.
Um eine eigene Syntaxhervorhebung bereitzustellen, müssen Sie eine Unterklasse von ` QSyntaxHighlighter ` erstellen und die Methode `highlightBlock()` neu implementieren. In Ihrer Neuimplementierung sollten Sie die ` text ` des Blocks analysieren und die Methode ` setFormat()` so oft wie nötig aufrufen, um die von Ihnen gewünschten Schriftart- und Farbänderungen anzuwenden. 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);
}
}Beispiele für die Verwendung von ` setCurrentBlockState()`, ` currentBlockState()` und ` previousBlockState()` zur Verarbeitung von Syntaxen mit Konstrukten, die sich über mehrere Textblöcke erstrecken, finden Sie in der Dokumentation zu ` Detailed Description `.
Siehe auch previousBlockState(), setFormat() und setCurrentBlockState().
[protected] int QSyntaxHighlighter::previousBlockState() const
Gibt den Endzustand des Textblocks zurück, der dem aktuellen Block des Syntax-Highlighters vorausgeht. Wenn zuvor kein Wert festgelegt wurde, ist der zurückgegebene Wert -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 erneut auf die angegebene URL 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)
Fügt das angegebene ` data ` an den aktuellen Textblock an. Die Eigentumsrechte werden an das zugrunde liegende Textdokument weitergegeben, d. h. das bereitgestellte ` QTextBlockUserData `-Objekt wird gelöscht, wenn der entsprechende Textblock gelöscht wird.
QTextBlockUserData kann zum Speichern benutzerdefinierter Einstellungen verwendet werden. Im Falle der Syntaxhervorhebung ist dies insbesondere als Cache-Speicher für Informationen interessant, die Sie beim Parsen des Absatztextes ermitteln.
Beispielsweise können Sie beim Parsen des Textes Klammerzeichen, auf die Sie stoßen („{[(“ und dergleichen), nachverfolgen und deren relative Position sowie den tatsächlichen „ QChar “ in einer einfachen, von „ QTextBlockUserData “ abgeleiteten Klasse speichern:
struct ParenthesisInfo
{
QChar character;
int position;
};
struct BlockData : public QTextBlockUserData
{
QList<ParenthesisInfo> parentheses;
};Während der Cursornavigation im zugehörigen Editor kannst du beim aktuellen „ QTextBlock “ (abgerufen mit der Funktion „ QTextCursor::block()“) abfragen, ob ein Benutzerdatenobjekt festgelegt ist, und dieses in dein „ BlockData “-Objekt umwandeln. Anschließend können Sie prüfen, ob die aktuelle Cursorposition mit einer zuvor erfassten Klammerposition übereinstimmt, und je nach Klammerart (öffnende oder schließende Klammer) die nächste öffnende oder schließende Klammer auf derselben Ebene ermitteln.
Auf diese Weise können Sie einen visuellen Klammerabgleich durchführen und den Bereich von der aktuellen Cursorposition bis zur passenden Klammer hervorheben. Das erleichtert es, eine fehlende Klammer in Ihrem Code zu erkennen und bei der Bearbeitung von Code mit vielen Klammern zu finden, wo sich eine entsprechende öffnende bzw. schließende Klammer befindet.
Siehe auch currentBlockUserData() und QTextBlock::setUserData().
void QSyntaxHighlighter::setDocument(QTextDocument *doc)
Installiert den Syntax-Highlighter unter der angegebenen Adresse 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 Syntax-Highlighters angewendet (d. h. auf den Text, der an die Funktion ` highlightBlock()` übergeben wird).
Der angegebene ` format ` wird auf den Text ab der Position ` start ` über eine Länge von ` count ` Zeichen angewendet (wenn ` count ` gleich 0 ist, erfolgt keine Aktion). Die in ` format ` festgelegten Formatierungseigenschaften werden zur Anzeigezeit mit den direkt im Dokument gespeicherten Formatierungsinformationen zusammengeführt, die beispielsweise zuvor mit den Funktionen von ` QTextCursor` festgelegt wurden. Beachten Sie, dass das Dokument selbst durch die über diese Funktion festgelegte Formatierung unverändert bleibt.
Siehe auch format() und highlightBlock().
[protected] void QSyntaxHighlighter::setFormat(int start, int count, const QColor &color)
Die angegebene „ color “ wird auf den aktuellen Textblock ab der Position „ start “ über eine Länge von „ count “ Zeichen angewendet.
Die übrigen Attribute des aktuellen Textblocks, z. B. die Schriftart und die Hintergrundfarbe, werden auf ihre Standardwerte zurückgesetzt.
Dies ist eine überladene Funktion.
Siehe auch format() und highlightBlock().
[protected] void QSyntaxHighlighter::setFormat(int start, int count, const QFont &font)
Die angegebene Formatierung „ font “ wird auf den aktuellen Textblock ab der Position „ start “ über eine Länge von „ count “ Zeichen angewendet.
Die übrigen Attribute des aktuellen Textblocks, z. B. die Schriftart und die Hintergrundfarbe, werden auf die Standardwerte zurückgesetzt.
Dies ist eine überladene Funktion.
Siehe auch format() und highlightBlock().
© 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.