Russian Qt Forum
Октябрь 01, 2024, 10:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: не работает highlightblock в QSyntaxHighlighter... заработал  (Прочитано 1604 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Июль 04, 2011, 17:12 »

не мудрствуя, сделал, как в фирменных примерах, и как везде рекомендуют

Код:
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, но решение не дают

ибо это очевидный баг...
« Последнее редактирование: Июль 04, 2011, 17:14 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.086 секунд. Запросов: 23.