QT 部件 QPlainTextEdit 成员函数 insertPlainText 使用心得

一般的应用程序,都会输出日志进行调试、用例测试或通知用户一些必要的信息。

在使用 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

67