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
确保了信号和槽的调用是异步的,即在接收者的事件处理线程中执行。