이 페이지에서

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)

보호된 함수

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 는 한 번에 하나의 문서에서만 사용할 수 있습니다.

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.