Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Exception13 от Октябрь 02, 2009, 09:46



Название: QPlainTextEdit, организовать скролинг
Отправлено: Exception13 от Октябрь 02, 2009, 09:46
Долго ковырялся, но пока так вразумительного ничего не получилось.
Общий смысл задачи: просмотр гигантских документов (в пределе до 2^63 байт) в текстовом/шестнадцетиричном виде, не требовательный к памяти.

Пытаюсь переделать компонент QPlainTextEdit под данные условия следующим образом:

Накладываю ограничение на количество строк, хранящихся в компоненте при помощи QPlainTextEdit::setMaximumBlockCount(). Соответственно, количество строк рассчитывается исходя из размеров окна и используемого шрифта.
Таким образом, при добавлении новой строки в компонент и переполнении значения QPlainTextEdit::maximumBlockCount, содержимое компонента будет скролиться вверх.
Очень даже замечательное средство для построчной прокрутки...Но хотелось бы, чтобы у компонента была возможность не только скролинга вверх, но и вниз.
Т.е.:
- курсор находится в позиции QTextCursor::End, делаем QPlainTextEdit::insertPlainText() и содержимое автоматически скролиться вверх.
(такая штука уже заложена в QPlainTextEdit)

- курсор находится в позиции QTextCursor::Start, делаем QPlainTextEdit::insertPlainText() и содержимое автоматически скролиться вниз и в самый верх добавляется новая строка.

А вот последнее хотелось бы реализовать, но пока не знаю как ?
Потому как, при полностью заполненном документе QPlainTextEdit'a последовательность команд:

Код
C++ (Qt)
QTextCursor cursor = textCursor();
cursor.movePosition( QTextCursor::Start );
cursor.insertText( tr("scroll down...\n") );
setTextCursor( cursor );

приводит к тому, что курсор перемещается в начало документа, добавляется новая строка, но, поскольку документ уже переполнен, то только что помещенная в него строка - удаляется, а хотелось бы, чтобы выталкивалась нижняя в данном случае.

Может кто, что посоветует ?




Название: Re: QPlainTextEdit, организовать скролинг
Отправлено: SimpleSunny от Октябрь 02, 2009, 15:58
1. Перед вставкой текста удалять необходимое количество блоков снизу, и оформить все в виде наследника QPlainTextEdit.
2. Подправить QTextDocumentPrivate на данный предмет и перекомпилировать Qt. Но будет непереносимое решение.
3. Написать троллям, пусть сами добавят подобный функционал.
4. Создать патч самому и отправить тролям :)