Selecting a piece of text using QTextCursor

8.3k views Asked by At

Having problems with selecting pieces of text using the Qt framework. For example if i have this document : "No time for rest". And i want to select "ime for r" and delete this piece of text from the document, how should i do it using QTextCursor? Here is my code:

QTextCursor *cursor = new QTextCursor(ui->plainTextEdit->document());
cursor->setPosition(StartPos,QTextCursor::MoveAnchor);
cursor->setPosition(EndPos,QTextCursor::KeepAnchor);
cursor->select(QTextCursor::LineUnderCursor);
cursor->clearSelection();

Unfortunately it deletes the whole line from the text. I've tried using other selection types like WordUnderCursor or BlockUnderCursor, but no result. Or maybe there is a better way to do it? Thanks in advance.

2

There are 2 answers

2
Pavel Strakhov On BEST ANSWER

There are several issues in your code:

  1. cursor->select(QTextCursor::LineUnderCursor); line selects whole current line. You don't want to delete whole line, so why would you write this? Remove this line of code.
  2. clearSelection() just deselects everything. Use removeSelectedText() instead.
  3. Don't create QTextCursor using new. It's correct but not needed. You should avoid pointers when possible. QTextCursor is usually passed by value or reference. Also you can use QPlainTextEdit::textCursor to get a copy of the edit cursor.

So, the code should look like that:

QTextCursor cursor = ui->plainTextEdit->textCursor();
cursor.setPosition(StartPos, QTextCursor::MoveAnchor);
cursor.setPosition(EndPos, QTextCursor::KeepAnchor);
cursor.removeSelectedText();
0
László Papp On

You are clearing the selection as opposed to the characters based on your desire.

Please read the documentation of the method:

void QTextCursor::clearSelection()

Clears the current selection by setting the anchor to the cursor position.

Note that it does not delete the text of the selection.

You can see that it only deleted the selection, not the text. Please use the following method instead:

void QTextCursor::removeSelectedText()

If there is a selection, its content is deleted; otherwise does nothing.

Having discussed the theory, let us demonstrate what you could write:

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();
        ^^^^^^^^^^^^^^^^^^