QSyntaxHighlighter Class

QSyntaxHighlighterクラスでは、構文のハイライトルールを定義することができ、さらにこのクラスを使ってドキュメントの現在の書式やユーザーデータを照会することができます。詳細...

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

注意:このクラスの関数はすべてリエントラントです。

パブリック関数

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

パブリックスロット

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

保護された関数

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は、setFormat ()関数を提供します。この関数は、現在のテキストブロックに、指定されたQTextCharFormat 。例えば

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 は、 カ ス タ ム設定を格納す る ために使 う こ と も で き ます。シンタックスハイライトの場合、特に、段落のテキストを解析している間にわかるかもしれない情報のキャッシュストレージとして興味深いです。

例えば、テキストを解析している間に遭遇した括弧文字('{[('など)を追跡し、それらの相対位置と実際のQCharQTextBlockUserData から派生したシンプルなクラスに保存することができます:

struct ParenthesisInfo
{
    QChar character;
    int position;
};

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

関連するエディタでのカーソル移動中に、現在のQTextBlockQTextCursor::block ()関数を使用して取得)にユーザーデータオブジェクトがセットされているかどうかを尋ね、BlockData オブジェクトにキャストすることができます。そして、現在のカーソル位置が以前に記録された括弧の位置と一致するかどうかをチェックし、括弧のタイプ(開括弧または閉括弧)に応じて、同じレベルで次の開括弧または閉括弧を見つけることができます。

このようにして、視覚的に括弧のマッチングを行い、現在のカーソル位置からマッチした括弧までをハイライトすることができます。これによって、コード中の括弧の欠落を見つけやすくなり、括弧を多用するコードを編集するときに、対応する開括弧や閉括弧がどこにあるかを見つけやすくなります。

currentBlockUserData() およびQTextBlock::setUserData()も参照

void QSyntaxHighlighter::setDocument(QTextDocument *doc)

指定されたQTextDocument doc にシンタックス・ハイライトをインストールします。QSyntaxHighlighter は、一度にひとつの文書にしか使えません。

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()も参照してください

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。