Russian Qt Forum

Qt => Общие вопросы => Тема начата: virtual_root от Декабрь 21, 2010, 14:00



Название: Подсветка парных скобок под курсором
Отправлено: virtual_root от Декабрь 21, 2010, 14:00
Ребята,не возникала ли ни у кого подобная задача? Я пишу текстовый редактор с возможностью подсветки синтаксиса для некоторого языка программирования. Использую пример из Qt. Переделала его под свою задачу, текст подсвечивается. Для подсветки наследуюсь от класса QSyntaxHighlighter, переопределяю метод virtual void highlightBlock(const QString &text); в котором собственно и запрограммирована вся подсветка.
Но вот с подсветкой парных скобок возникла проблема... Дело в том что сам методт virtual void highlightBlock(const QString &text); получает только текущий блок! И подсветка выполняется ровно в одной строке, с горем пополам... При повторном нажитии мышкой возле скобки подсветка уже не выполняется,видимо он уже обработал весь блок. Вообще получается что он один раз скобку выделил и потом если я не удалю парную скобку подсветка не исчезнет! Т.е. он не реагирует на положение курсора в строке....!
Чем можно отлавливать положение курсора???
Как мне получить все предыдущие блоки?? Вообще весь текст? Или как из предыдущих блоков вызволять строчки чтобы в цикле их проверять??
 Я попробовала метод previousBlockState(); но он всё время мне возращает -1.
Может кто знает что делать??????  
Привиду код,который написала для подсветки в текущей строке:
Код:
  int count =0;
     scope_right = -1;
     for (int i = 0; i < text.length(); ++i) {
         if (text.mid(i,1)=="}"){
             count = 0;
             int j=i-1;
             while (j>0){
                 if (text.mid(j,1)=="}") count++;
                 else
                 if (text.mid(j,1)=="{" && count==0){
                     setFormat(j,1,Qt::red);
                     scope_right=j; break;
                 }
                 else
                 if(text.mid(j,1)=="{" && count>0) count--;
                 j--;
             }
         }

     }
     for (int i = 0; i < text.length(); ++i){
         if (text.mid(i,1)!="{" || text.mid(i,1)!="}")
         setFormat(scope_right,1,Qt::black);
}


Название: Re: Подсветка парных скобок под курсором
Отправлено: Пантер от Декабрь 21, 2010, 14:35
Покопайся в исходниках QtCreator, там это точно есть.


Название: Re: Подсветка парных скобок под курсором
Отправлено: DmP от Декабрь 21, 2010, 15:11
Я попробовала метод previousBlockState(); но он всё время мне возращает -1.
Может кто знает что делать??????  

previousBlockState нужно самому задавать, по результату highlightBlock(), тогда в следующем вызове будет результат предыдущего вызова.


Название: Re: Подсветка парных скобок под курсором
Отправлено: DmP от Декабрь 21, 2010, 17:07
Но вот с подсветкой парных скобок возникла проблема... Дело в том что сам методт virtual void highlightBlock(const QString &text); получает только текущий блок! И подсветка выполняется ровно в одной строке, с горем пополам... При повторном нажитии мышкой возле скобки подсветка уже не выполняется,видимо он уже обработал весь блок. Вообще получается что он один раз скобку выделил и потом если я не удалю парную скобку подсветка не исчезнет! Т.е. он не реагирует на положение курсора в строке....!
Чем можно отлавливать положение курсора???
См. сигнал QTextDocument::cursorPositionChanged() и слот QSyntaxHighlighter::rehighlightBlock().


Название: Re: Подсветка парных скобок под курсором
Отправлено: virtual_root от Декабрь 21, 2010, 20:13
спасибо всем ответившим,сейчас попробую ваши советы.