Sur cette page

QSyntaxHighlighter Class

La classe `QSyntaxHighlighter` vous permet de définir des règles de mise en évidence de la syntaxe ; vous pouvez également l'utiliser pour interroger le formatage actuel d'un document ou ses données utilisateur. En savoir plus...

En-tête : #include <QSyntaxHighlighter>
CMake : find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake : QT += gui
Hérite de : QObject

Remarque : toutes les fonctions de cette classe sont réentrantes.

Fonctions publiques

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

Slots publics

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

Fonctions protégées

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)

Description détaillée

La classe QSyntaxHighlighter est une classe de base permettant de mettre en œuvre des surligneurs de syntaxe QTextDocument s. Un surligneur de syntaxe met automatiquement en évidence certaines parties du texte dans une QTextDocument. Les surligneurs de syntaxe sont souvent utilisés lorsque l'utilisateur saisit du texte dans un format spécifique (par exemple, du code source) et aident l'utilisateur à lire le texte et à identifier les erreurs de syntaxe.

Pour fournir votre propre mise en évidence de syntaxe, vous devez créer une sous-classe de QSyntaxHighlighter et réimplémenter la méthode highlightBlock().

Lorsque vous créez une instance de votre sous-classe de QSyntaxHighlighter, transmettez-lui l'QTextDocument auquel vous souhaitez appliquer la mise en évidence de la syntaxe. Par exemple :

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

Ensuite, votre fonction ` highlightBlock()` sera appelée automatiquement chaque fois que cela sera nécessaire. Utilisez votre fonction ` highlightBlock()` pour appliquer une mise en forme (par exemple, définir la police et la couleur) au texte qui lui est transmis. QSyntaxHighlighter fournit la fonction ` setFormat()` qui applique une ` QTextCharFormat ` donnée au bloc de texte actuel. Par exemple :

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

Certaines syntaxes peuvent comporter des constructions s'étendant sur plusieurs blocs de texte. Par exemple, un surligneur de syntaxe C++ doit être capable de gérer les commentaires multilignes /*...* / . Pour traiter ces cas, il est nécessaire de connaître l'état final du bloc de texte précédent (par exemple, « dans un commentaire »).

Au sein de votre implémentation de highlightBlock(), vous pouvez interroger l’état final du bloc de texte précédent à l’aide de la fonction previousBlockState(). Après avoir analysé le bloc, vous pouvez enregistrer le dernier état à l’aide de setCurrentBlockState().

Les fonctions ` currentBlockState()` et ` previousBlockState()` renvoient une valeur de type `int`. Si aucun état n’est défini, la valeur renvoyée est -1. Vous pouvez attribuer n’importe quelle autre valeur pour identifier un état donné à l’aide de la fonction ` setCurrentBlockState()`. Une fois l’état défini, l’ QTextBlock conserve cette valeur jusqu’à ce qu’elle soit redéfinie ou jusqu’à ce que le paragraphe de texte correspondant soit supprimé.

Par exemple, si vous écrivez un simple surligneur de syntaxe C++, vous pouvez attribuer la valeur 1 pour signifier « dans un commentaire » :

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

Dans l’exemple ci-dessus, nous définissons d’abord l’état du bloc actuel sur 0. Ensuite, si le bloc précédent se terminait à l’intérieur d’un commentaire, nous mettons en surbrillance à partir du début du bloc actuel (startIndex = 0). Sinon, nous recherchons l’expression de début donnée. Si l’expression de fin spécifiée est introuvable dans le bloc de texte, nous modifions l’état du bloc actuel en appelant setCurrentBlockState(), et nous nous assurons que le reste du bloc est mis en évidence.

De plus, vous pouvez interroger le formatage actuel et les données utilisateur à l’aide des fonctions format() et currentBlockUserData(), respectivement. Vous pouvez également associer des données utilisateur au bloc de texte actuel à l’aide de la fonction setCurrentBlockUserData(). La fonction QTextBlockUserData peut être utilisée pour stocker des paramètres personnalisés. Dans le cas de la coloration syntaxique, elle s’avère particulièrement intéressante comme mémoire cache pour les informations que vous pourriez découvrir lors de l’analyse du texte du paragraphe. Pour un exemple, consultez la documentation relative à la fonction setCurrentBlockUserData().

Voir également QTextDocument et Exemple de surlignage de syntaxe.

Documentation sur les fonctions membres

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

Crée un objet QSyntaxHighlighter avec l'parent spécifié.

Si le parent est un ` QTextEdit`, il installe le surligneur de syntaxe sur le document du parent. L'QTextEdit spécifié devient également le propriétaire du `QSyntaxHighlighter`.

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

Crée un objet QSyntaxHighlighter et l'installe sur parent. L'QTextDocument spécifiée devient également le propriétaire du QSyntaxHighlighter.

[virtual noexcept] QSyntaxHighlighter::~QSyntaxHighlighter()

Destructeur. Désinstalle ce surligneur de syntaxe du document texte.

[protected] QTextBlock QSyntaxHighlighter::currentBlock() const

Renvoie le bloc de texte actuel.

[protected] int QSyntaxHighlighter::currentBlockState() const

Renvoie l'état du bloc de texte actuel. Si aucune valeur n'est définie, la valeur renvoyée est -1.

Voir également setCurrentBlockState().

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

Renvoie l'objet ` QTextBlockUserData ` précédemment associé au bloc de texte actuel.

Voir également QTextBlock::userData() et setCurrentBlockUserData().

QTextDocument *QSyntaxHighlighter::document() const

Renvoie l'QTextDocument sur lequel ce surligneur de syntaxe est installé.

Voir aussi setDocument().

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

Renvoie le format disponible à l'adresse position à l'intérieur du bloc de texte actuel du surligneur de syntaxe.

Voir aussi setFormat().

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

Met en surbrillance le bloc de texte indiqué. Cette fonction est appelée lorsque cela est nécessaire par le moteur de texte enrichi, c'est-à-dire sur les blocs de texte qui ont été modifiés.

Pour proposer votre propre mise en évidence syntaxique, vous devez créer une sous-classe de ` QSyntaxHighlighter ` et réimplémenter la méthode `highlightBlock()`. Dans votre réimplémentation, vous devez analyser le contenu du bloc ( text ) et appeler la méthode ` setFormat()` autant de fois que nécessaire pour appliquer les modifications de police et de couleur souhaitées. Par exemple :

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

Consultez la classe ` Detailed Description ` pour des exemples d’utilisation des méthodes ` setCurrentBlockState()`, ` currentBlockState()` et ` previousBlockState()` afin de gérer des syntaxes comportant des constructions s’étendant sur plusieurs blocs de texte

Voir également previousBlockState(), setFormat() et setCurrentBlockState().

[protected] int QSyntaxHighlighter::previousBlockState() const

Renvoie l'état final du bloc de texte précédant le bloc actuel du surligneur de syntaxe. Si aucune valeur n'a été définie auparavant, la valeur renvoyée est -1.

Voir également highlightBlock() et setCurrentBlockState().

[slot] void QSyntaxHighlighter::rehighlight()

Réapplique la mise en évidence à l'ensemble du document.

Voir également rehighlightBlock().

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

Réapplique la mise en évidence à l'QTextBlock indiquée block.

Voir également rehighlight().

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

Définit l'état du bloc de texte actuel sur « newState ».

Voir également currentBlockState() et highlightBlock().

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

Associe l'data donné au bloc de texte actuel. La propriété est transmise au document de texte sous-jacent ; en d'autres termes, l'objet QTextBlockUserData fourni sera supprimé si le bloc de texte correspondant est supprimé.

QTextBlockUserData Peut être utilisé pour stocker des paramètres personnalisés. Dans le cas de la coloration syntaxique, cela s’avère particulièrement intéressant comme espace de cache pour les informations que vous pouvez découvrir lors de l’analyse du texte du paragraphe.

Par exemple, lors de l’analyse du texte, vous pouvez garder une trace des caractères de parenthèses que vous rencontrez (« {[( » et autres), et stocker leur position relative ainsi que l’ QChar e réelle dans une classe simple dérivée de ` QTextBlockUserData` :

struct ParenthesisInfo
{
    QChar character;
    int position;
};

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

Lors de la navigation du curseur dans l’éditeur associé, vous pouvez demander à l’ QTextBlock actuelle (récupérée à l’aide de la fonction QTextCursor::block()) si elle dispose d’un objet de données utilisateur défini, puis le convertir en votre objet BlockData. Vous pouvez ensuite vérifier si la position actuelle du curseur correspond à une position de parenthèse précédemment enregistrée et, selon le type de parenthèse (d'ouverture ou de fermeture), trouver la parenthèse d'ouverture ou de fermeture suivante au même niveau.

De cette manière, vous pouvez effectuer une correspondance visuelle des parenthèses et mettre en surbrillance la zone allant de la position actuelle du curseur jusqu’à la parenthèse correspondante. Cela facilite la détection d’une parenthèse manquante dans votre code et permet de localiser la parenthèse d’ouverture ou de fermeture correspondante lors de l’édition d’un code comportant de nombreuses parenthèses.

Voir également currentBlockUserData() et QTextBlock::setUserData().

void QSyntaxHighlighter::setDocument(QTextDocument *doc)

Installe le surligneur de syntaxe sur l'QTextDocument spécifiée doc. Un QSyntaxHighlighter ne peut être utilisé qu'avec un seul document à la fois.

Voir également document().

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

Cette fonction s'applique au bloc de texte actuel du surligneur de syntaxe (c'est-à-dire au texte transmis à la fonction ` highlightBlock()`).

Le formatage spécifié par ` format ` est appliqué au texte à partir de la position ` start ` sur une longueur de ` count ` caractères (si ` count ` est égal à 0, aucune opération n’est effectuée). Les propriétés de mise en forme définies dans ` format ` sont fusionnées au moment de l’affichage avec les informations de mise en forme stockées directement dans le document, par exemple telles qu’elles ont été précédemment définies à l’aide des fonctions de ` QTextCursor`. Notez que le document lui-même n’est pas modifié par le format défini via cette fonction.

Voir également format() et highlightBlock().

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

L'color spécifiée est appliquée au bloc de texte actuel à partir de la position start sur une longueur de count caractères.

Les autres attributs du bloc de texte actuel, par exemple la police et la couleur d'arrière-plan, sont réinitialisés à leurs valeurs par défaut.

Il s'agit d'une fonction surchargée.

Voir également format() et highlightBlock().

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

L'font spécifiée est appliquée au bloc de texte actuel à partir de la position start sur une longueur de count caractères.

Les autres attributs du bloc de texte actuel, par exemple la police et la couleur d'arrière-plan, sont réinitialisés à leurs valeurs par défaut.

Il s'agit d'une fonction surchargée.

Voir également format() et 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.