не мудрствуя, сделал, как в фирменных примерах, и как везде рекомендуют
void Highlighter::highlightBlock(const QString &text)
{
foreach( HighRule rule, highlightRules )
{
QRegExp expression( rule.pattern );
int index = expression.indexIn( text );
while( index >= 0 )
{
int length = expression.matchedLength();
setFormat( index, length, rule.format );
index = expression.indexIn( text, index + length );
}
}
}
где
struct HighRule
{
QRegExp pattern;
QTextCharFormat format;
};
QVector<HighRule> highlightRules; перед этим честно заполнен паттернами и форматами полутора сотен слов, даже не шаблонов, а именно целых слов
напускаю это на живой текст, получаю его первую строку в text и дальше бред какой-то - несмотря на то, что первого же паттерна в тексте и близко нет, для него int index = expression.indexIn( text ); дает 0, и int length = expression.matchedLength(); тоже 0, из-за чего while( index >= 0 ) превращается в forever
делал и чуть по-другому
void Highlighter::highlightBlock(const QString &text)
{
foreach( HighRule rule, highlightRules )
{
QRegExp expression( rule.pattern );
int index = text.indexOf( expression );
while( index >= 0 )
{
int length = expression.matchedLength();
setFormat( index, length, rule.format );
index = text.indexOf( expression, index + length );
}
}
}
но результат точно такой же
причем везде рекомендуется именно этот код или его незначительные вариации, и вроде бы у людей это работает
ну ладно, думаю, щаз... заменяю
while( index >= 0 )
на
while( index > 0 )
и все начинает тут же работать, но... разумеется если текст не начинается с самого начала строки
дальше, само собой
void Highlighter::highlightBlock(const QString &text)
{
foreach( HighRule rule, highlightRules )
{
QRegExp expression( rule.pattern );
int index = text.indexOf( expression );
while( index >= 0 )
{
int length = expression.matchedLength();
if( ! length )
break;
setFormat( index, length, rule.format );
index = text.indexOf( expression, index + length );
}
}
}
и все получилось...
но вот не понятно - неужели только у меня такой капканчик нашелся? причем в одном месте пишут, типа known issue, но решение не дают
ибо это очевидный баг...