Russian Qt Forum

Qt => Общие вопросы => Тема начата: Авварон от Октябрь 10, 2009, 16:09



Название: QTextEdit/QSyntax Highlighter
Отправлено: Авварон от Октябрь 10, 2009, 16:09
пишу хайлайтер для некого языка.
Проблема при открытии большого файла - на 2 секунды подвисает текст эдит (при открытии файла ~150кб). Как сказать QTextEdit'у не парсить на подсветку весь текст сразу (а по выводу хайлайтера именно это и происходит - построчно парсит весь текст), а допустим только видимую часть?


Название: Re: QTextEdit/QSyntax Highlighter
Отправлено: andrewshkovskii от Октябрь 10, 2009, 17:14
пишу хайлайтер для некого языка.
Проблема при открытии большого файла - на 2 секунды подвисает текст эдит (при открытии файла ~150кб). Как сказать QTextEdit'у не парсить на подсветку весь текст сразу (а по выводу хайлайтера именно это и происходит - построчно парсит весь текст), а допустим только видимую часть?
Честно говоря, работал с этими 2мя классами я крайне мало, но могу подсказать вот что :
1: читать файлы лучше в отдельном потоке, что бы не блокировать GUI.
2. По сигналу того, что текст загружен в эдитор - начать парсить.(так же лучше в отдельном потоке)
А что насчет подсветки видимой части - не знаю, если нету велосипеда по поводу возвращаемого номера сток, которые сейчас видны в эдиторе, я бы парсил частями.


Название: Re: QTextEdit/QSyntax Highlighter
Отправлено: Авварон от Октябрь 10, 2009, 19:20
эдитор сам определяет, когда парсить. Вопрос в том и состоял можно ли ему объяснить, что парсить.
Надо бы глянуть исходики qtcreator'а...


Название: Re: QTextEdit/QSyntax Highlighter
Отправлено: andrewshkovskii от Октябрь 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 )

Вроде так..если я чего-то не понимаю, то объясни, попробуем ещё раз разобраться:)


Название: Re: QTextEdit/QSyntax Highlighter
Отправлено: Авварон от Октябрь 11, 2009, 17:00
void QSyntaxHighlighter::highlightBlock ( const QString & text )   [pure virtual protected]
да, эта функция предназначена для разбиения процесса парсинга. Но ее зовет движок TextEdit'а и когда ее звать определяет он. На деле выходит так: при открыти файла текст разбивается построчно и для каждой строки зовется highlightBlock. А хотелось бы чтобы звалась только для видимых строк.
а юзер дата это совсем не то вроде...


Название: Re: QTextEdit/QSyntax Highlighter
Отправлено: andrewshkovskii от Октябрь 11, 2009, 17:45
Отнаследуйся от QSyntaxHightlighter и перегрузи highlightBlock.. ?


Название: Re: QTextEdit/QSyntax Highlighter
Отправлено: Авварон от Октябрь 11, 2009, 18:09
так и сделано


Название: Re: QTextEdit/QSyntax Highlighter
Отправлено: andrewshkovskii от Октябрь 11, 2009, 20:02
Покажи функции, которые ты перегрузил-то?:)


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


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

К каждому блоку всего текста сразу, это не правильно(ну ты это сам понимаешь), извини, сейчас нет возможности проверить самому, не дома я, как смогу- посмотрю в чем там дело. Вообще надо почитать, насчет метода, возвращающего текущий видимый фрагмент кода.


Название: Re: QTextEdit/QSyntax Highlighter
Отправлено: andrewshkovskii от Октябрь 12, 2009, 00:17
http://forum.vingrad.ru/users/Torsten

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


Название: Re: QTextEdit/QSyntax Highlighter
Отправлено: Авварон от Октябрь 12, 2009, 10:02
ну даже если я найду блок, неясно что с ним делать:) кормить его в HighlightBlock бессмысленно, тк он и так уже размечен при загрузке текста...


Название: Re: QTextEdit/QSyntax Highlighter
Отправлено: andrewshkovskii от Октябрь 12, 2009, 10:40
Покажи, как ты подключаешь парсер?просто может тебе стоит его не подключать сразу, а отправлять на парсинг эти самые видимые блоки через
Код:
void QSyntaxHighlighter::setCurrentBlockUserData ( QTextBlockUserData * data )   [protected]

 ?


Название: Re: QTextEdit/QSyntax Highlighter
Отправлено: Авварон от Октябрь 12, 2009, 11:12
http://doc.trolltech.com/4.5/qsyntaxhighlighter.html#setCurrentBlockUserData (http://doc.trolltech.com/4.5/qsyntaxhighlighter.html#setCurrentBlockUserData)
оно совсем не то делает. оно нужно для разных специфичных блоков текста, таких как скобки


Название: Re: QTextEdit/QSyntax Highlighter
Отправлено: andrewshkovskii от Октябрь 12, 2009, 11:14
Ох, извини, чет я попутался :)