Sur cette page

QSyntaxHighlighter Class

La classe QSyntaxHighlighter vous permet de définir des règles de mise en évidence de la syntaxe. En outre, vous pouvez utiliser cette classe pour interroger le formatage actuel d'un document ou les données utilisateur. Plus d'informations...

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

Note : 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)

Emplacements 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 pour l'implémentation des surligneurs de syntaxe QTextDocument. Un surligneur de syntaxe met automatiquement en évidence des parties de texte dans un document . Un surligneur syntaxique met automatiquement en évidence certaines parties du texte dans un document QTextDocument. Les surligneurs syntaxiques sont souvent utilisés lorsque l'utilisateur saisit du texte dans un format spécifique (par exemple un code source) et l'aident à lire le texte et à identifier les erreurs de syntaxe.

Pour fournir votre propre surlignage syntaxique, vous devez sous-classer QSyntaxHighlighter et réimplémenter highlightBlock().

Lorsque vous créez une instance de votre sous-classe QSyntaxHighlighter, transmettez-lui le site QTextDocument auquel vous souhaitez appliquer la coloration syntaxique. Par exemple :

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

Par la suite, votre fonction highlightBlock() sera appelée automatiquement chaque fois que nécessaire. Utilisez votre fonction highlightBlock() pour appliquer une mise en forme (par exemple en définissant 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 en cours. Par exemple, la fonction QSyntaxHighlighter

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 avoir des constructions qui s'étendent sur plusieurs blocs de texte. Par exemple, un surligneur de syntaxe C++ doit être capable de traiter 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 le commentaire").

Dans votre implémentation de highlightBlock(), vous pouvez demander 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 la fonction setCurrentBlockState().

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

Par exemple, si vous écrivez un simple surligneur de syntaxe C++, vous pouvez désigner 1 pour signifier "en 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 courant à 0. Ensuite, si le bloc précédent s'est terminé dans un commentaire, nous surlignons à partir du début du bloc courant (startIndex = 0). Sinon, nous recherchons l'expression de début donnée. Si l'expression de fin spécifiée ne peut être trouvée dans le bloc de texte, nous modifions l'état actuel du bloc en appelant setCurrentBlockState(), et nous nous assurons que le reste du bloc est mis en évidence.

En outre, vous pouvez interroger le formatage actuel et les données utilisateur à l'aide des fonctions format() et currentBlockUserData() respectivement. Vous pouvez également attacher des données utilisateur au bloc de texte actuel à l'aide de la fonction setCurrentBlockUserData(). QTextBlockUserData peut être utilisé pour stocker des paramètres personnalisés. Dans le cas de la coloration syntaxique, elle est particulièrement intéressante en tant que mémoire cache pour les informations que vous pouvez découvrir lors de l'analyse du texte du paragraphe. Pour un exemple, voir la documentation de setCurrentBlockUserData().

Voir également QTextDocument et Syntax Highlighter Example.

Documentation sur les fonctions membres

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

Construit un QSyntaxHighlighter avec l'adresse parent donnée.

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

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

Construit un QSyntaxHighlighter et l'installe sur parent. L'adresse QTextDocument spécifiée devient également 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 retournée est -1.

Voir aussi setCurrentBlockState().

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

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

Voir aussi QTextBlock::userData() et setCurrentBlockUserData().

QTextDocument *QSyntaxHighlighter::document() const

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

Voir aussi setDocument().

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

Renvoie le format à position dans le bloc de texte actuel de l'outil de mise en évidence de la syntaxe.

Voir aussi setFormat().

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

Met en évidence le bloc de texte donné. Cette fonction est appelée si nécessaire par le moteur de texte riche, c'est-à-dire pour les blocs de texte qui ont été modifiés.

Pour fournir votre propre mise en évidence de la syntaxe, vous devez sous-classer QSyntaxHighlighter et réimplémenter highlightBlock(). Dans votre réimplémentation, vous devez analyser le bloc text et appeler setFormat() aussi souvent que nécessaire pour appliquer tous les changements de police et de couleur dont vous avez besoin. 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);
    }
}

Voir Detailed Description pour des exemples d'utilisation de setCurrentBlockState(), currentBlockState() et previousBlockState() pour gérer des syntaxes avec des constructions qui s'étendent 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 de l'outil de mise en évidence de la syntaxe. Si aucune valeur n'a été définie précédemment, la valeur retournée est -1.

Voir aussi highlightBlock() et setCurrentBlockState().

[slot] void QSyntaxHighlighter::rehighlight()

Réapplique le surlignage à l'ensemble du document.

Voir aussi rehighlightBlock().

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

Réapplique le surlignage à l'élément donné QTextBlock block .

Voir aussi rehighlight().

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

Définit l'état du bloc de texte actuel à newState.

Voir également currentBlockState() et highlightBlock().

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

Attache l'objet data au bloc de texte actuel. La propriété est transmise au document texte sous-jacent, c'est-à-dire que l'objet QTextBlockUserData fourni sera supprimé si le bloc texte correspondant est supprimé.

QTextBlockUserData peut être utilisé pour stocker des paramètres personnalisés. Dans le cas de la coloration syntaxique, elle est particulièrement intéressante en tant que mémoire 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èse que vous rencontrez ('{[(' et autres), et stocker leur position relative et l'adresse QChar dans une simple classe dérivée de QTextBlockUserData:

struct ParenthesisInfo
{
    QChar character;
    int position;
};

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

Pendant la navigation du curseur dans l'éditeur associé, vous pouvez demander au site QTextBlock (récupéré à l'aide de la fonction QTextCursor::block()) s'il dispose d'un ensemble d'objets de données utilisateur et 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, en fonction du type de parenthèse (ouvrante ou fermante), trouver la parenthèse ouvrante ou fermante suivante au même niveau.

De cette manière, vous pouvez effectuer une comparaison visuelle des parenthèses et mettre en évidence la position actuelle du curseur jusqu'à la parenthèse correspondante. Il est ainsi plus facile de repérer une parenthèse manquante dans votre code et de trouver où se trouve la parenthèse ouvrante/fermante correspondante lors de l'édition d'un code à forte teneur en parenthèses.

Voir aussi currentBlockUserData() et QTextBlock::setUserData().

void QSyntaxHighlighter::setDocument(QTextDocument *doc)

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

Voir aussi document().

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

Cette fonction est appliquée au bloc de texte actuel de l'outil de mise en évidence de la syntaxe (c'est-à-dire le texte transmis à la fonction highlightBlock()).

La fonction format spécifiée est appliquée au texte à partir de la position start pour une longueur de count caractères (si count est 0, rien n'est fait). Les propriétés de formatage définies dans format sont fusionnées au moment de l'affichage avec les informations de formatage stockées directement dans le document, par exemple celles qui ont été définies précédemment avec les fonctions de QTextCursor. Notez que le document lui-même n'est pas modifié par le format défini par cette fonction.

Voir également format() et highlightBlock().

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

L'adresse color spécifiée est appliquée au bloc de texte actuel à partir de la position start pour 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 ramenés aux valeurs par défaut.

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

Voir aussi format() et highlightBlock().

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

L'adresse font spécifiée est appliquée au bloc de texte actuel à partir de la position start pour 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 ramenés aux valeurs par défaut.

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

Voir aussi 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.