Я использую Qt QSyntaxHighlighter, чтобы закрасить синтаксис, похожий на C, в QML TextEdit
Все отлично работает, кроме многострочных комментариев.
Я обнаруживаю их так:
void highlightBlock(QString const& text) override {
bool inMultilineComment = previousBlockState() == STATES::COMMENT;
bool inSingleLineComment = false;
int previousIndex = 0;
QRegularExpression expr("(\\/\\*|\\*\\/|\\/\\/|\n)"); // will match either /**, /**, // or \n
QRegularExpressionMatchIterator it = expr.globalMatch(text);
while(it.hasNext()) {
QRegularExpressionMatch match = it.next();
const QString captured = match.captured(1);
if(captured == "/*" && !inSingleLineComment) {
inMultilineComment = true;
previousIndex = match.capturedStart(1);
}
if(captured == "*/" && inMultilineComment) {
inMultilineComment = false;
setFormat(previousIndex, match.capturedEnd(1) - previousIndex, _commentFormat);
}
if(captured == "//" && !inMultilineComment) {
inSingleLineComment = true;
}
if(captured == "\n" && inSingleLineComment) {
inSingleLineComment = false;
}
}
if(inMultilineComment) {
setFormat(previousIndex, text.size() - previousIndex, _commentFormat);
setCurrentBlockState(STATES::COMMENT);
}
else {
setCurrentBlockState(STATES::NONE);
}
}
Это работает, пока я не возьму многострочный комментарий, уже окрашенный, и не удаляю /*
в начале. Только блок, содержащий /*
, обрабатывается и перекрашивается, но не следующие, что означает, что они продолжают появляться с комментариями, когда их нет.
Есть ли простой способ заставить QSyntaxHighlighter повторно обрабатывать следующие блоки, чтобы предотвратить такое неправильное окрашивание?