问:如何将textEdit游标移动到特定的col和row

时间:2016-10-17 08:01:42

标签: qt

我可以通过 QTextCursor :: blockNumber() QTextCursor :: positionInBlock() 即可。我的问题是如何使用row和col将光标移动到特定位置。像

setPosition(x,y) // The current cursor would move to row x and col y.

有可能吗?

2 个答案:

答案 0 :(得分:4)

简易解决方案:

只需将光标移动到那里:

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也是一种转换方式。没有循环的类似方法也在最后。

更多解释,也许是更好的解决方案:

理论上,文本没有GUI中显示的“行”,但endline-character \n\r\n取决于操作系统和框架)是只是另一个角色。所以对于光标来说,大多数事情都只是一个没有线条的“文本”。

有一些包装函数可以解决这个问题,但我稍后会介绍它们。首先,您不能通过QTextEdit接口直接访问它们,但您必须直接操作光标。

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

现在进行“操作”:

如果您知道要在字符串中的哪个位置,那么setPosition()就在这里。这个“位置”不是关于垂直线,而是整个文本。

这是多行字符串在内部的外观:

"Hello, World!\nAnotherLine"

这将显示

Hello, World!
AnotherLine

setPosition()想要内部字符串的位置。

要移至另一条线,您必须通过查找文本中的第一个\n来计算位置并添加x偏移量。如果您希望第3行查找前2 \n等等。

幸运的是,还有函数setVerticalMovement似乎包装了这个,也许就是你想要做的。它垂直移动光标。

所以你可以这样做:

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

之后用光标调用setTextCursor,如上所示。

注意:

但订单很重要。 setPosition设置整个文本中的位置。所以setPosition(5)虽然可能在第3行,但将其设置为您所在行中的第5个字符,而不是整个文本。所以首先移动x-cordinate然后移动y。

你需要知道线条的长度。

some longer line
short
another longer line

如果现在指定第2行和第7列,它将是“越界”。我不确定verticalMovement这里的表现如何。我假设光标将在行的末尾。

直接使用QTextCursor类时,您也可以使用不带循环的移动操作,因为它们有一个额外的参数来重复操作。

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

答案 1 :(得分:3)

我认为最好的方法是通过QTextCursor

例如,如果您的QTextEdit被称为textEdit

QTextCursor textCursor = ui->textEdit->textCursor();

textCursor.movePosition(QTextCursor::Down, QTextCursor::MoveAnchor, x);
textCursor.movePosition(QTextCursor::Right, QTextCursor::MoveAnchor, y);

ui->textEdit->setTextCursor(textCursor);

xy是必需的位置。