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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTextEdit/QSyntax Highlighter  (Прочитано 8386 раз)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« : Октябрь 10, 2009, 16:09 »

пишу хайлайтер для некого языка.
Проблема при открытии большого файла - на 2 секунды подвисает текст эдит (при открытии файла ~150кб). Как сказать QTextEdit'у не парсить на подсветку весь текст сразу (а по выводу хайлайтера именно это и происходит - построчно парсит весь текст), а допустим только видимую часть?
Записан
andrewshkovskii
Гость
« Ответ #1 : Октябрь 10, 2009, 17:14 »

пишу хайлайтер для некого языка.
Проблема при открытии большого файла - на 2 секунды подвисает текст эдит (при открытии файла ~150кб). Как сказать QTextEdit'у не парсить на подсветку весь текст сразу (а по выводу хайлайтера именно это и происходит - построчно парсит весь текст), а допустим только видимую часть?
Честно говоря, работал с этими 2мя классами я крайне мало, но могу подсказать вот что :
1: читать файлы лучше в отдельном потоке, что бы не блокировать GUI.
2. По сигналу того, что текст загружен в эдитор - начать парсить.(так же лучше в отдельном потоке)
А что насчет подсветки видимой части - не знаю, если нету велосипеда по поводу возвращаемого номера сток, которые сейчас видны в эдиторе, я бы парсил частями.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #2 : Октябрь 10, 2009, 19:20 »

эдитор сам определяет, когда парсить. Вопрос в том и состоял можно ли ему объяснить, что парсить.
Надо бы глянуть исходики qtcreator'а...
Записан
andrewshkovskii
Гость
« Ответ #3 : Октябрь 11, 2009, 15:26 »


Не может эдитор сам определять когда парсить, ты же подключаешь парсер к редактору, ведь так?по-крайней мере конструктор у парсера

Код:
QSyntaxHighlighter ( QTextEdit * parent )

А парсить, как я понял, можно отдельные блоки :

Цитировать
void QSyntaxHighlighter::highlightBlock ( const QString & text )   [pure virtual protected]

Highlights the given text block(...)
А так же ему можно дать конкретный блок текста для парсинга :

Код:
void QSyntaxHighlighter::setCurrentBlockUserData ( QTextBlockUserData * data )

Вроде так..если я чего-то не понимаю, то объясни, попробуем ещё раз разобраться:)
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Октябрь 11, 2009, 17:00 »

void QSyntaxHighlighter::highlightBlock ( const QString & text )   [pure virtual protected]
да, эта функция предназначена для разбиения процесса парсинга. Но ее зовет движок TextEdit'а и когда ее звать определяет он. На деле выходит так: при открыти файла текст разбивается построчно и для каждой строки зовется highlightBlock. А хотелось бы чтобы звалась только для видимых строк.
а юзер дата это совсем не то вроде...
Записан
andrewshkovskii
Гость
« Ответ #5 : Октябрь 11, 2009, 17:45 »

Отнаследуйся от QSyntaxHightlighter и перегрузи highlightBlock.. ?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #6 : Октябрь 11, 2009, 18:09 »

так и сделано
Записан
andrewshkovskii
Гость
« Ответ #7 : Октябрь 11, 2009, 20:02 »

Покажи функции, которые ты перегрузил-то?Улыбающийся
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #8 : Октябрь 11, 2009, 20:08 »

Я делал как в примере про syntax highlighter (qtdemo/RichText/SyntaxHighlighter). Честно говоря, просто скопипастил код и поудалял лишнее/добавил свое. Но мне надо гораздо больше keyword'ов и типов в языке, нежели в с++ - как следствие сильно тормозит применение всех правил (у меня одних типов штук 40) к каждому блоку всего текста сразу.
В примере класс унаследован от QSyntaxHighlighter и перегружена highlightBlock.
Записан
andrewshkovskii
Гость
« Ответ #9 : Октябрь 11, 2009, 23:59 »

Я делал как в примере про syntax highlighter (qtdemo/RichText/SyntaxHighlighter). Честно говоря, просто скопипастил код и поудалял лишнее/добавил свое. Но мне надо гораздо больше keyword'ов и типов в языке, нежели в с++ - как следствие сильно тормозит применение всех правил (у меня одних типов штук 40) к каждому блоку всего текста сразу.
В примере класс унаследован от QSyntaxHighlighter и перегружена highlightBlock.

К каждому блоку всего текста сразу, это не правильно(ну ты это сам понимаешь), извини, сейчас нет возможности проверить самому, не дома я, как смогу- посмотрю в чем там дело. Вообще надо почитать, насчет метода, возвращающего текущий видимый фрагмент кода.
Записан
andrewshkovskii
Гость
« Ответ #10 : Октябрь 12, 2009, 00:17 »

http://forum.vingrad.ru/users/Torsten

Спроси у этого человека, он нашел способ найти видимый пользователем блок текста.
( http://forum.vingrad.ru/topic-216008.html )
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #11 : Октябрь 12, 2009, 10:02 »

ну даже если я найду блок, неясно что с ним делать:) кормить его в HighlightBlock бессмысленно, тк он и так уже размечен при загрузке текста...
Записан
andrewshkovskii
Гость
« Ответ #12 : Октябрь 12, 2009, 10:40 »

Покажи, как ты подключаешь парсер?просто может тебе стоит его не подключать сразу, а отправлять на парсинг эти самые видимые блоки через
Код:
void QSyntaxHighlighter::setCurrentBlockUserData ( QTextBlockUserData * data )   [protected]

 ?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #13 : Октябрь 12, 2009, 11:12 »

http://doc.trolltech.com/4.5/qsyntaxhighlighter.html#setCurrentBlockUserData
оно совсем не то делает. оно нужно для разных специфичных блоков текста, таких как скобки
Записан
andrewshkovskii
Гость
« Ответ #14 : Октябрь 12, 2009, 11:14 »

Ох, извини, чет я попутался Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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