QSyntaxHighlighter Class
QSyntaxHighlighterクラスでは、構文のハイライトルールを定義することができ、さらにこのクラスを使ってドキュメントの現在の書式やユーザーデータを照会することができます。さらに...
ヘッダー | #include <QSyntaxHighlighter> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
qmake: | QT += gui |
継承: | QObject |
- 継承メンバを含む全メンバのリスト
- QSyntaxHighlighterはリッチテキスト処理APIの一部です。
注意:このクラスの関数はすべてリエントラントです。
パブリック関数
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 は、 カ ス タ ム設定を格納す る ために使 う こ と も で き ます。シンタックスハイライトの場合、特に、段落のテキストを解析している間にわかるかもしれない情報のキャッシュストレージとして興味深いです。
例えば、テキストを解析している間に遭遇した括弧文字('{[('など)を追跡し、それらの相対位置と実際の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 は、一度にひとつの文書にしか使えません。
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()も参照 。
© 2025 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.