一般的应用程序,都会输出日志进行调试、用例测试或通知用户一些必要的信息。
在使用 QT 的示例代码,用只读部件 QPlainTextEdit 显示 mqttclient 日志信息时,因为可与部件交互进行滚动显示或复制部分日志文本,结果导致后续产生的日志会输出到最后光标所在位置,从而完全打乱了日志输出。
如果将部件 QPlainTextEdit 的 enable 属性设置为 false ,又无法与部件进行交互了,查看不了之前的日志,也不能复制一些必要的文本内容。

然后尝试获取部件当前的光标,然后移动到文档开头,再用 insertPlainText 输出日志。代码形如:
ui->editLog->textCursor().setPosition(QTextCursor::Start);
ui->editLog->insertPlainText("log content...");结果却没有任何效果,问题依旧。
在仔细阅读了相关 QT QPlainTextEdit::textCursor 文档后。发现一个说明,获取到的 textCursor 是一份新的拷贝,在修改了光标的属性后,需要使用 setTextCursor 函数更新当前 QPlainTextEdit 的 textCursor。

最终修改的代码形如:
// The bellow code is no affect the QPlainTextEdit editLog.
// ui->editLog->textCursor().setPosition(QTextCursor::Start);
QTextCursor _cursor = ui->editLog->textCursor();
// Absolute position, QTextCursor::Start is 0.
// The setPosition can do same thing.
// _cursor.setPosition(0);
// Use movePosition with enum to move the cursor to document begin and insert log by time descending order.
_cursor.movePosition(QTextCursor::Start);
ui->editLog->setTextCursor(_cursor);
ui->editLog->insertPlainText("log content...");
最终日志查看器形如:

完整的项目代码发布在 codeberg.org qtlearning 。