QSyntaxHighlighter Class

QSyntaxHighlighter 클래스를 사용하면 구문 강조 표시 규칙을 정의할 수 있으며, 이 클래스를 사용하여 문서의 현재 서식 또는 사용자 데이터를 쿼리할 수도 있습니다. 더 보기...

Header: #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++ 구문 하이라이터는 /*...* / 여러 줄 주석에 대응할 수 있어야 합니다. 이러한 경우를 처리하려면 이전 텍스트 블록의 끝 상태(예: "in comment")를 알아야 합니다.

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

연결된 편집기에서 커서를 탐색하는 동안 현재 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() 함수에 전달되는 텍스트)에 적용됩니다.

지정된 formatstart 위치의 텍스트에 count 문자 길이만큼 적용됩니다( count 이 0인 경우 아무 작업도 수행되지 않음). format 에 설정된 서식 속성은 표시 시점에 문서에 직접 저장된 서식 정보와 병합됩니다(예: 이전에 QTextCursor 의 함수로 설정한 것처럼). 문서 자체는 이 함수를 통해 설정된 서식에 의해 수정되지 않습니다.

format() 및 highlightBlock()도 참조하세요 .

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

이 함수는 과부하된 함수입니다.

지정된 colorstart 위치에서 현재 텍스트 블록에 count 문자 길이만큼 적용됩니다.

현재 텍스트 블록의 다른 속성(예: 글꼴 및 배경색)은 기본값으로 재설정됩니다.

format() 및 highlightBlock()도 참조하세요 .

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

이 함수는 과부하된 함수입니다.

지정된 fontstart 위치에서 현재 텍스트 블록에 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.