QTextEdit文本编辑框的光标移动

时间:2024-05-31 07:25:39

1.问题描述

用Qt写一个串口调试工具,用一个QTextEdit作为接收显示区。发现每次串口调试工具接收完一帧数据后,QTextEdit的光标自动跳到文本开头的位置。这样,当接收到大量数据后,就要手动拉动滑块进行翻页,才能看到最新的数据。文本框赋值的方式为ui->QTextEdit->setText(),不是用的ui->QTextEdit->append()。实测发现,采用后者追加文本的方式,不存在这个问题。但是由于逻辑需要,必须要采用前一种方式,因此考虑手动设置光标位置,让光标每次都移动到文本末尾。


2.解决办法

调用QTextEdit类的成员函数“moveCursor”可以设置光标的位置。其函数原型如下:

void QTextEdit::moveCursor ( QTextCursor::MoveOperation operation, QTextCursor::MoveMode mode = QTextCursor::MoveAnchor )

其中,

参数operation是指定光标的操作类型,可选的值有:Up,Down,Left,Right,End,EndOfLine等等,分别对应不同的动作,这个很好理解。我们这里是想让光标移动到文本编辑框的末尾,因此选择参数End。

参数mode光从字面上的意思,可能不太容易知道它的作用。通过Qt自带的帮助文档,可以得到下面的信息:

QTextEdit文本编辑框的光标移动

同时,还有这样一句描述“If the anchor() is kept where it is and the position() is moved, the text in between will be selected”。通过这些信息,可以推测出,选择参数KeepAnchor的话,在光标移动的同时,会选中被光标掠过的文本,类似于鼠标的拖动动作。通过试验,验证了这个推测。下图是选择参数KeepAnchor的效果:

QTextEdit文本编辑框的光标移动


这里我们不想让文本被选中,所以选择了参数MoveAnchor。


3.总结

通过调用如下语句,可以将光标移动到文本末尾。其他类型的文本控件也是同理,不再赘述。

ui->QTextEdit_rx->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);

相关文章