Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Гурман от Февраль 18, 2010, 10:27



Название: как избавиться от буферизации при добавлении в QTextEdit?
Отправлено: Гурман от Февраль 18, 2010, 10:27
есть объект этого класса, используется как "консоль" с возможностью скопировать из нее, выводить цветной текст и т.д.

но при последовательном добавлении строк в него они "буферизуются", то есть, не показываются сразу после добавления, а появляются все вместе, когда вывод завершается и управление переходит на ожидание действий пользователя

как лучше всего "протолкнуть" выводимый текст, чтобы он появлялся в окне сразу после добавления в QTextEdit? каждый раз отдавать управление на цикл ожидания - не хочется, может другие способы есть? текст в объект этого класса выводится довольно медленно, при добавлении всего пары сотен строк есть очень ощутимая задержка, на две-три секунды, поэтому еще больше тормозить никак не надо

текст добавляется в объект таким образом:

Код:
		listOutput->moveCursor( QTextCursor::End );
listOutput->insertPlainText( aString );


Название: Re: как избавиться от буферизации при добавлении в QTextEdit?
Отправлено: Павел_F. от Февраль 18, 2010, 10:54
Вопрос возник. А почему QTextEdit?
Цитата: справка гласит
QPlainTextEdit is an advanced viewer/editor supporting plain text. It is optimized to handle large documents and to respond quickly to user input.

QPlainText uses very much the same technology and concepts as QTextEdit, but is optimized for plain text handling.
Т.е. вроде как QPlainTextEdit более подходит к вашей задаче. Он, если верить справке, должен работать быстрее. И у него уже будет метод void QPlainTextEdit::appendPlainText ( const QString & text ). Да и ваша проблема в нем, полагаю, должна решиться сама собой.

PS: правда он появился в Qt 4.4


Название: Re: как избавиться от буферизации при добавлении в QTextEdit?
Отправлено: Гурман от Февраль 18, 2010, 11:01
возможно надо его использовать, просто подключили по-началу то, что первое на взгляд подходит

ну и вроде как QTextEdit позволяет внутри параграфа менять шрифт и, что важнее, цвет текста, а QPlainTextEdit только устанавливать на параграф целиком


Название: Re: как избавиться от буферизации при добавлении в QTextEdit?
Отправлено: Павел_F. от Февраль 18, 2010, 11:19
Я никогда не сталкивался с задачей раскрасить текст, поэтому уверенно говорить об этом не могу.
Но в той же справке упоминается что "Just like QPlainTextEdit works together with QSyntaxHighlighter." А если оно позволяет организовать подсветку синтаксиса то, полагаю, текст тоже разрисовать можно по всякому.


Название: Re: как избавиться от буферизации при добавлении в QTextEdit?
Отправлено: Гурман от Февраль 18, 2010, 11:45
а, ну да, там написано "Each character within a paragraph has its own attributes, for example, font and color."

хотя не хляет с первого раза - переделал на QPlainTextEdit, визуально скорости не добавилось (может незначительно), и появились ненужности - выводимую строку считает "параграфом", добавляет вывод \n после нее, даже если строка символа \n не содержит, хотя надо настройками поиграть

и тоже "буферизует"...   >:( если вывести 10000 раз строку, задержка секунд 12, и потом все сразу появляется

а не может это какой-нибудь другой связанный с текстом объект вытворять? тут и QWidget, и QFrame... все равно не ясно, как заставить текст появляться после вывода каждой строки



Название: Re: как избавиться от буферизации при добавлении в QTextEdit?
Отправлено: Igors от Февраль 18, 2010, 12:12
Код:
		listOutput->moveCursor( QTextCursor::End );
listOutput->insertPlainText( aString );
может по-простому добавить
Код:
listOutput->repaint();


Название: Re: как избавиться от буферизации при добавлении в QTextEdit?
Отправлено: Павел_F. от Февраль 18, 2010, 12:20
Вот и я бы думал что копать надо в сторону всяких QPainter'ов. Скорее это их рук дело.


Название: Re: как избавиться от буферизации при добавлении в QTextEdit?
Отправлено: Гурман от Февраль 18, 2010, 12:21
хм... помогло  ;D

а в параграф строку превращает вызов appendPlainText()

если ставить курсор в конец, и потом insertPlainText() то нормально получается