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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Подсветка парных скобок под курсором  (Прочитано 4072 раз)
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);
}
« Последнее редактирование: Декабрь 21, 2010, 14:02 от virtual_root » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Декабрь 21, 2010, 14:35 »

Покопайся в исходниках QtCreator, там это точно есть.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
DmP
Гость
« Ответ #2 : Декабрь 21, 2010, 15:11 »

Я попробовала метод previousBlockState(); но он всё время мне возращает -1.
Может кто знает что делать?Непонимающий??  

previousBlockState нужно самому задавать, по результату highlightBlock(), тогда в следующем вызове будет результат предыдущего вызова.
Записан
DmP
Гость
« Ответ #3 : Декабрь 21, 2010, 17:07 »

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

спасибо всем ответившим,сейчас попробую ваши советы.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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