我可以通过 QTextCursor :: blockNumber() 和 QTextCursor :: positionInBlock() 即可。我的问题是如何使用row和col将光标移动到特定位置。像
setPosition(x,y) // The current cursor would move to row x and col y.
有可能吗?
答案 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);
x
和y
是必需的位置。