Russian Qt Forum
Апрель 26, 2024, 12:15 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Программно установить видимый курсор в QPlainTextEdit.  (Прочитано 5517 раз)
Setner
Гость
« : Апрель 04, 2017, 07:27 »

Здравствуйте! Есть QPlainTextEdit с большим текстом. Нужно сделать навигацию по тексту(также как, например, работает функция Найти в текстовом редакторе). Покопавшись по форумам, и перепробовав все варианты, я так и не смог получить рабочий результат. Может быть кто-то сталкивался с подобной задачей и поделится опытом? На входе есть некое число - позиция, в которую следует перевести видимый курсор. Плюс к этому необходимо, чтобы скроллбары QPlainTextEdit также автоматически перемещались в нужные места. Задача вроде бы тривиальная, но, как оказалось, не всё так просто. Буду рад работающему примеру. Благодарю!
Записан
TheGringerEye
Гость
« Ответ #1 : Апрель 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
Записан
Setner
Гость
« Ответ #2 : Апрель 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);
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #3 : Апрель 04, 2017, 15:38 »

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

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

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

там всю папку нужно скопировать в проект и подключать через pri файл:
Код
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 не хуже Улыбающийся
Записан

TheGringerEye
Гость
« Ответ #4 : Апрель 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);
Записан
Setner
Гость
« Ответ #5 : Апрель 04, 2017, 23:08 »

Вы можете попробовать добавить к себе мой старый подпроект, который добавляет виджет для поиска и замены.

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


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

ui->plainTextEdit->setTextCursor(cursor);

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

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

И всё заработало. Благодарю!
Записан
TheGringerEye
Гость
« Ответ #6 : Апрель 05, 2017, 01:18 »

Пожалуйста.
Так же в QPlainTextEdit есть методы по управлению выделением текста, так, что после поиска можно выделить нужный фрагмент и переставить курсор в его начало.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.087 секунд. Запросов: 22.