Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Selecting a piece of text using QTextCursor

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.

like image 637
Zan Avatar asked Oct 26 '25 12:10

Zan


2 Answers

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();
like image 64
Pavel Strakhov Avatar answered Oct 29 '25 02:10

Pavel Strakhov


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();
        ^^^^^^^^^^^^^^^^^^
like image 34
lpapp Avatar answered Oct 29 '25 02:10

lpapp



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!