Russian Qt Forum

Qt => Общие вопросы => Тема начата: Setner от Апрель 04, 2017, 07:27



Название: Программно установить видимый курсор в QPlainTextEdit.
Отправлено: Setner от Апрель 04, 2017, 07:27
Здравствуйте! Есть QPlainTextEdit с большим текстом. Нужно сделать навигацию по тексту(также как, например, работает функция Найти в текстовом редакторе). Покопавшись по форумам, и перепробовав все варианты, я так и не смог получить рабочий результат. Может быть кто-то сталкивался с подобной задачей и поделится опытом? На входе есть некое число - позиция, в которую следует перевести видимый курсор. Плюс к этому необходимо, чтобы скроллбары QPlainTextEdit также автоматически перемещались в нужные места. Задача вроде бы тривиальная, но, как оказалось, не всё так просто. Буду рад работающему примеру. Благодарю!


Название: Re: Программно установить видимый курсор в QPlainTextEdit.
Отправлено: TheGringerEye от Апрель 04, 2017, 07:34
У QPlainTextEdit получаем QTextCursor через метод
Код:
QTextCursor QPlainTextEdit::textCursor() const
, далее с этим курсором делаем что хотим, к примеру ставим ему позицию на любой символом с помощью метода
Код:
void QTextCursor::setPosition(int pos, MoveMode m = MoveAnchor);
http://doc.qt.io/qt-4.8/qplaintextedit.html#textCursor
http://doc.qt.io/qt-4.8/qtextcursor.html#setPosition


Название: Re: Программно установить видимый курсор в QPlainTextEdit.
Отправлено: Setner от Апрель 04, 2017, 08:26
У QPlainTextEdit получаем QTextCursor через метод
Код:
QTextCursor QPlainTextEdit::textCursor() const

Цитировать
QTextCursor QPlainTextEdit::textCursor() const

Returns a copy of the QTextCursor that represents the currently visible cursor. Note that changes on the returned cursor do not affect QPlainTextEdit's cursor; use setTextCursor() to update the visible cursor.

See also setTextCursor().

Я так понимаю это просто копия, не ссылка на сам курсор.

После того, как это всё делаю, даже если я просто устанавливаю значение позиции курсора на 1, у меня поле ввода QPlainTextEdit становится недоступным для редактирования текста.

Код:
QTextCursor cursor;
cursor.setPosition(1);

ui->plainTextEdit->setTextCursor(cursor);


Название: Re: Программно установить видимый курсор в QPlainTextEdit.
Отправлено: gil9red от Апрель 04, 2017, 15:38
Здравствуйте! Есть QPlainTextEdit с большим текстом. Нужно сделать навигацию по тексту(также как, например, работает функция Найти в текстовом редакторе). Покопавшись по форумам, и перепробовав все варианты, я так и не смог получить рабочий результат. Может быть кто-то сталкивался с подобной задачей и поделится опытом? На входе есть некое число - позиция, в которую следует перевести видимый курсор. Плюс к этому необходимо, чтобы скроллбары QPlainTextEdit также автоматически перемещались в нужные места. Задача вроде бы тривиальная, но, как оказалось, не всё так просто. Буду рад работающему примеру. Благодарю!

Вы можете попробовать добавить к себе мой старый подпроект, который добавляет виджет для поиска и замены: https://github.com/gil9red/NotesManager/tree/master/FindAndReplace

Насколько я помню, там подсветка найденного текста есть.

там всю папку нужно скопировать в проект и подключать через pri файл (https://github.com/gil9red/NotesManager/blob/master/NotesManager.pro):
Код
C++ (Qt)
include( FindAndReplace/FindAndReplace.pri )

Сам проект вряд ли сможете собрать, но отдельные его классы / модули работающие

Использование:
Код
C++ (Qt)
QTextEdit * editor = new QTextEdit();
QuickFind * quickFind = new QuickFind(editor);
 
editor->show()
quickFind ->show()
 

С QPlainTextEdit сразу не заработает -- разные предки у QTextEdit и QPlainTextEdit, но QTextEdit не хуже :)


Название: Re: Программно установить видимый курсор в QPlainTextEdit.
Отправлено: TheGringerEye от Апрель 04, 2017, 15:54
Цитировать
После того, как это всё делаю, даже если я просто устанавливаю значение позиции курсора на 1, у меня поле ввода QPlainTextEdit становится недоступным для редактирования текста.

Код:
QTextCursor cursor;
cursor.setPosition(1);

ui->plainTextEdit->setTextCursor(cursor);


Так делать нельзя, так вы заменяете курсор у plainTextEdit на новый курсор, вам нужно получить старый.

Код:
QTextCursor cursor = ui->plainTextEdit->textCursor();
cursor.setPosition(10);

ui->plainTextEdit->setTextCursor(cursor);


Название: Re: Программно установить видимый курсор в QPlainTextEdit.
Отправлено: Setner от Апрель 04, 2017, 23:08
Вы можете попробовать добавить к себе мой старый подпроект, который добавляет виджет для поиска и замены.

Благодарю за помощь!


Код:
QTextCursor cursor = ui->plainTextEdit->textCursor();
cursor.setPosition(10);

ui->plainTextEdit->setTextCursor(cursor);

Добавил после вашего кода

Код:
ui->plainTextEdit->setFocus();

И всё заработало. Благодарю!


Название: Re: Программно установить видимый курсор в QPlainTextEdit.
Отправлено: TheGringerEye от Апрель 05, 2017, 01:18
Пожалуйста.
Так же в QPlainTextEdit есть методы по управлению выделением текста, так, что после поиска можно выделить нужный фрагмент и переставить курсор в его начало.