C++ QT UI日志更新

时间:2024-11-17 22:20:54

C++ QT进行Log记录,打印然后更新在UI上,一般可以通过QPlainTextEdit进行信息更新

void Diary::appendPlainText(const int& type, const QString& log )
{
    ui->plainTextEdit->moveCursor(QTextCursor::End);
    ui->plainTextEdit->insertPlainText(log);
    ui->plainTextEdit->moveCursor(QTextCursor::End);
}

但存在一个问题,可能在关闭exe时会因为访问已经release的对象造成内存溢出

可以使用以下方法进行log的记录

void Diary::appendPlainText(const int &type, const QString &log)
{
    Q_UNUSED(type)
    if (ui && ui->plainTextEdit)
    {
        QMetaObject::invokeMethod(this, [this, log]{
            ui->plainTextEdit->moveCursor(QTextCursor::End);
            ui->plainTextEdit->insertPlainText(log);
            ui->plainTextEdit->moveCursor(QTextCursor::End); }, Qt::QueuedConnection);
    }
}

这个函数使用了 QMetaObject::invokeMethod 来异步地更新文本编辑器。这意味着更新文本编辑器的操作将在事件队列中排队,稍后由Qt的事件循环处理。这样做的好处是,如果这个函数是在非GUI线程中调用的,它可以安全地更新GUI组件,而不会违反Qt的线程安全规则。Qt::QueuedConnection 确保了信号和槽的调用是异步的,即在接收者的事件处理线程中执行。