Qt: how to move textEdit cursor to specific col and row

c++, qt, qtextedit

Solution

Easy solution:

Just move the cursor there:

textEdit.moveCursor(QTextCursor::Start); //set to start
for( <... y-times ...> )
{
    textEdit.moveCursor(QTextCursor::Down); //move down
}
for( < ... x-times ...>) 
{
    textEdit.moveCursor(QTextCursor::Right); //move right
}

moveCursor is also the goto-way if you need to "select" text for changing it. A similar approach without the loops is also at the end.

A bit more explanation and maybe better solution:

In theory a text has no "lines" like shown in GUIs but the `endline-character` (`\n` or `\r\n` depending on operating system and framework) is only just another character. So for a cursor mostly everything is just one "text" without lines.

There are wrapper functions to deal with this but I get to them later. First you cannot access those directly via the `QTextEdit` interface but you have to manipulate the cursor directly.

QTextCursor curs = textEdit.textCursor(); //copies current cursor
//... cursor operations
textEdit.setTextCursor(curs);

Now for the "operations":

If you know at what position you want to go in the string you have `setPosition()` here. This "position" is not in respect to vertical lines though, but the whole text.

This is what a multi-line string looks internally:

"Hello, World!\nAnotherLine"

This would show

Hello, World!
AnotherLine

`setPosition()` wants the position of the internal string.

To move to another line you would have to calculate the position by looking for the first `\n` in the text and add your x-offset. If you want the 3rd line look for the first 2 `\n` etc.

Luckily there is also the function `setVerticalMovement` which seems to wrap this and maybe is what you want to do. It moves the cursor vertically.

So you could do:

curs.setPosition(x); //beginning at first line
curs.setVerticalMovement(y); //move down to the line you want.

After that call `setTextCursor` like shown above with the cursor.

Note:

The order is important though. `setPosition` sets the position in the whole text. So `setPosition(5)` while maybe in the 3rd line will not set it to the 5th character in the line you are but of the whole text. So move the x-cordinate first then y.

You need to be aware of the lengths of the lines though.

some longer line
short
another longer line

If you now specify line 2 and column 7 it will be "out-of-bounds". I am not sure how `verticalMovement` here behaves. I assume the cursor will be at the end of the line.

When you use the `QTextCursor` class directly you can also use the move operations without the loops because they have an extra parameter to repeat the operations.

curs.movePosition(QTextCursor::Start);
curs.movePosition(QTextCursor::Down,<modeMode>,y); //go down y-times
curs.movePosition(QTextCursor::Right,<moveMode>,x); //go right x-times

Problem

I can get the current position in row and col via QTextCursor::blockNumber() and QTextCursor::positionInBlock(). My question is that how to move the cursor to the specific position with row and col. like ``` setPosition(x,y) // The current cursor would move to row x and col y. ``` Is it possible to do that?

Original source