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