このページでは

QSyntaxHighlighter Class

QSyntaxHighlighter クラスを使用すると、構文強調表示のルールを定義できるほか、ドキュメントの現在の書式設定やユーザーデータを照会することもできます。詳細...

ヘッダー: #include <QSyntaxHighlighter>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui
継承元: QObject

注:このクラスのすべての関数は再入可能です。

パブリック関数

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

パブリック・スロット

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

Protected 関数

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)

詳細な説明

QSyntaxHighlighterクラスは、QTextDocument の構文ハイライト機能を実装するための基底クラスです。構文ハイライト機能は、QTextDocument 内のテキストの一部を自動的に強調表示します。構文ハイライト機能は、ユーザーが特定の形式(ソースコードなど)でテキストを入力する際によく使用され、テキストの読みやすさを向上させ、構文エラーの発見を支援します。

独自の構文ハイライト機能を提供するには、QSyntaxHighlighter をサブクラス化し、highlightBlock() を再実装する必要があります。

QSyntaxHighlighterのサブクラスのインスタンスを作成する際は、構文ハイライトを適用したいQTextDocument をそのインスタンスに引数として渡します。例:

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

これ以降、必要に応じてhighlightBlock()関数が自動的に呼び出されます。highlightBlock()関数を使用して、渡されたテキストに書式設定(フォントや色の設定など)を適用してください。QSyntaxHighlighterは、現在のテキストブロックに対して指定されたQTextCharFormat を適用するsetFormat()関数を提供しています。例:

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

構文によっては、複数のテキストブロックにまたがる構文要素が存在する場合があります。例えば、C++の構文ハイライト機能では、/*...* / といった複数行にわたるコメントに対応できる必要があります。このようなケースに対処するには、前のテキストブロックの終了状態(例:「コメント内」)を把握しておく必要があります。

highlightBlock() の実装内では、previousBlockState() 関数を使用して、前のテキストブロックの終了状態を取得できます。ブロックの解析後、setCurrentBlockState() を使用して最後の状態を保存できます。

currentBlockState() およびpreviousBlockState() 関数は int 型の値を返します。状態が設定されていない場合、戻り値は -1 になります。setCurrentBlockState() 関数を使用することで、任意の状態を識別するために任意の値を指定できます。状態が設定されると、QTextBlock はその値が再度設定されるか、対応するテキスト段落が削除されるまで、その値を保持し続けます。

たとえば、単純な C++ 構文ハイライト機能を作成する場合、「コメント内」を表すために 1 を指定することができます:

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

上記の例では、まず現在のブロック状態を 0 に設定します。次に、前のブロックがコメント内で終了していた場合、現在のブロックの先頭からハイライトを行います(startIndex = 0 )。 そうでない場合は、指定された開始式を検索します。指定された終了式がテキストブロック内で見つからない場合、setCurrentBlockState() を呼び出して現在のブロック状態を変更し、ブロックの残りの部分がハイライトされるようにします。

さらに、format() 関数とcurrentBlockUserData() 関数をそれぞれ使用して、現在の書式設定やユーザーデータを照会することができます。 また、setCurrentBlockUserData() 関数を使用して、現在のテキストブロックにユーザーデータを付加することもできます。QTextBlockUserData は、カスタム設定を保存するために使用できます。構文ハイライトの場合、段落のテキストを解析する過程で判明した情報のキャッシュストレージとして特に有用です。例については、setCurrentBlockUserData() のドキュメントを参照してください。

「 QTextDocument 」および「構文ハイライトの例」も参照してください 。

メンバ関数のドキュメント

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

指定されたparent を使用して、QSyntaxHighlighterを構築します。

親がQTextEdit である場合、その親のドキュメントに構文ハイライト機能を適用します。指定されたQTextEdit も、QSyntaxHighlighterの所有者となります。

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

QSyntaxHighlighter を作成し、parent に配置します。指定された `QTextDocument ` も、その QSyntaxHighlighter の所有者となります。

[virtual noexcept] QSyntaxHighlighter::~QSyntaxHighlighter()

デストラクタ。テキスト文書からこの構文ハイライト機能をアンインストールします。

[protected] QTextBlock QSyntaxHighlighter::currentBlock() const

現在のテキストブロックを返します。

[protected] int QSyntaxHighlighter::currentBlockState() const

現在のテキストブロックの状態を返します。値が設定されていない場合、戻り値は -1 になります。

setCurrentBlockState()も参照してください 。

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

現在のテキストブロックに以前にアタッチされていたQTextBlockUserData オブジェクトを返します。

QTextBlock::userData() およびsetCurrentBlockUserData()も参照してください 。

QTextDocument *QSyntaxHighlighter::document() const

この構文ハイライト機能がインストールされているQTextDocument を返します。

setDocument()も参照してください 。

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

構文ハイライトツールの現在のテキストブロック内で、position に指定された書式を返します。

setFormat()も参照してください 。

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

指定されたテキストブロックを強調表示します。この関数は、リッチテキストエンジンによって必要に応じて、つまり変更されたテキストブロックに対して呼び出されます。

独自の構文強調表示を実装するには、QSyntaxHighlighter をサブクラス化し、highlightBlock()を再実装する必要があります。再実装では、ブロックのtext を解析し、必要なフォントや色の変更を適用するために、setFormat()を必要な回数だけ呼び出す必要があります。例:

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

複数のテキストブロックにまたがる構文を処理するために、setCurrentBlockState()、currentBlockState()、およびpreviousBlockState() を使用する例については、Detailed Description を参照してください。

previousBlockState()、setFormat()、およびsetCurrentBlockState()も参照してください 。

[protected] int QSyntaxHighlighter::previousBlockState() const

構文ハイライト機能の現在のブロックの直前のテキストブロックの終了状態を返します。以前に値が設定されていない場合、戻り値は -1 になります。

highlightBlock() およびsetCurrentBlockState()も参照してください 。

[slot] void QSyntaxHighlighter::rehighlight()

文書全体にハイライトを再度適用します。

rehighlightBlock()も参照してください 。

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

指定されたQTextBlock block に対して、ハイライトを再適用します。

rehighlight()も参照してください 。

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

現在のテキストブロックの状態を「newState 」に設定します。

currentBlockState() およびhighlightBlock()も参照してください 。

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

指定されたdata を現在のテキストブロックに紐付けます。所有権は基になるテキストドキュメントに渡されるため、対応するテキストブロックが削除されると、渡されたQTextBlockUserData オブジェクトも削除されます。

QTextBlockUserData カスタム設定の保存に使用できます。構文ハイライトの場合、段落のテキストを解析する過程で判明した情報のキャッシュ領域として特に有用です。

例えば、テキストを解析する際に、遭遇した括弧文字('{[(' など)を追跡し、それらの相対位置と実際のQChar を、QTextBlockUserData から派生した単純なクラスに格納することができます:

struct ParenthesisInfo
{
    QChar character;
    int position;
};

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

関連するエディタでカーソルを移動する際、現在のQTextBlock (QTextCursor::block()関数を使用して取得)にユーザーデータオブジェクトが設定されているかどうかを確認し、それをBlockData オブジェクトにキャストすることができます。 その後、現在のカーソル位置が以前に記録された括弧の位置と一致するかどうかを確認し、括弧の種類(開き括弧または閉じ括弧)に応じて、同じレベルにある次の開き括弧または閉じ括弧を特定できます。

このようにして、視覚的な括弧の一致確認を行い、現在のカーソル位置から一致する括弧までをハイライト表示できます。これにより、コード内の欠落した括弧を見つけやすくなり、括弧が多用されるコードを編集する際に、対応する開き括弧や閉じ括弧がどこにあるかを特定しやすくなります。

currentBlockUserData() およびQTextBlock::setUserData()も参照してください 。

void QSyntaxHighlighter::setDocument(QTextDocument *doc)

指定されたQTextDocument doc に構文ハイライト機能をインストールします。QSyntaxHighlighter は、一度に1つのドキュメントでのみ使用できます。

document()も参照してください 。

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

この関数は、構文ハイライト機能の現在のテキストブロック(つまり、highlightBlock() 関数に渡されるテキスト)に対して適用されます。

指定されたformat は、start の位置からcount 文字分(count が0の場合は何も行われない)のテキストに対して適用されます。format で設定された書式設定プロパティは、表示時に、例えばQTextCursor の関数で以前に設定されたものなど、ドキュメント内に直接格納されている書式設定情報とマージされます。なお、ドキュメント自体は、この関数を通じて設定された書式によって変更されることはありません。

format() およびhighlightBlock()も参照してください 。

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

指定されたcolor は、start の位置からcount 文字の長さにわたり、現在のテキストブロックに適用されます。

現在のテキストブロックのその他の属性(フォントや背景色など)は、デフォルト値にリセットされます。

これはオーバーロードされた関数です。

format() およびhighlightBlock()も参照してください 。

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

指定されたfont は、start の位置からcount 文字分の長さにおいて、現在のテキストブロックに適用されます。

現在のテキストブロックのその他の属性(フォントや背景色など)は、デフォルト値にリセットされます。

これはオーバーロードされた関数です。

format() および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.