Выбор фрагмента текста с помощью QTextCursor
Проблемы с выделением фрагментов текста с использованием фреймворка Qt. Например, если у меня есть этот документ: "Нет времени на отдых". И я хочу выбрать "IME для R" и удалить этот фрагмент текста из документа, как я должен сделать это с помощью QTextCursor? Вот мой код:
QTextCursor *cursor = new QTextCursor(ui->plainTextEdit->document());
cursor->setPosition(StartPos,QTextCursor::MoveAnchor);
cursor->setPosition(EndPos,QTextCursor::KeepAnchor);
cursor->select(QTextCursor::LineUnderCursor);
cursor->clearSelection();
К сожалению, он удаляет всю строку из текста. Я пытался использовать другие типы выбора, такие как WordUnderCursor или BlockUnderCursor, но безрезультатно. Или, может быть, есть лучший способ сделать это? Заранее спасибо.
2 ответа
В вашем коде есть несколько проблем:
cursor->select(QTextCursor::LineUnderCursor);
линия выбирает всю текущую строку. Вы не хотите удалять всю строку, так зачем вы пишете это? Удалите эту строку кода.clearSelection()
просто отменяет выбор использованиеremoveSelectedText()
вместо.- Не создавать
QTextCursor
с помощьюnew
, Это правильно, но не нужно. Вы должны избегать указателей, когда это возможно.QTextCursor
обычно передается по значению или ссылке. Также вы можете использоватьQPlainTextEdit::textCursor
чтобы получить копию редактируемого курсора.
Итак, код должен выглядеть так:
QTextCursor cursor = ui->plainTextEdit->textCursor();
cursor.setPosition(StartPos, QTextCursor::MoveAnchor);
cursor.setPosition(EndPos, QTextCursor::KeepAnchor);
cursor.removeSelectedText();
Вы очищаете выбор в отличие от персонажей по вашему желанию.
Пожалуйста, ознакомьтесь с документацией метода:
void QTextCursor:: clearSelection ()
Очищает текущий выбор, устанавливая привязку в положение курсора.
Обратите внимание, что это не удаляет текст выбора.
Вы можете видеть, что он только удалил выделение, а не текст. Пожалуйста, используйте следующий метод:
void QTextCursor:: removeSelectedText ()
Если есть выбор, его содержимое удаляется; в противном случае ничего не делает.
Обсудив теорию, давайте продемонстрируем, что вы могли бы написать:
QTextCursor *cursor = new QTextCursor(ui->plainTextEdit->document());
cursor->setPosition(StartPos,QTextCursor::MoveAnchor);
cursor->setPosition(EndPos,QTextCursor::KeepAnchor);
// If any, this should be block selection
cursor->select(QTextCursor::BlockUnderCursor);
cursor->removeSelectedText();
^^^^^^^^^^^^^^^^^^