我们一般使用Qt开发应用程序时,都有将控制台窗口去掉。但是,有时候又需要查看一些调试信息,一般的处理方式是把log写到一个文件中。本文介绍以下日志窗口,可以更方便的查看日志信息。
UI设计
推拽UI控件,修改默认背景。
日志打印接口
目前仅支持三种操作,可根据需要扩展。
/*
* 文档操作方式
*/
enum
{
ADD_TYPE_NOLINE = 0, // 不换行
ADD_TYPE_LINE, // 换行
ADD_TYPE_REPLACE_LINE, // 替换当前行
};
void ShowLogDlg::AppendLogMessage(const QString& msg, const QString& color, uint16_t optType)
{
// 格式化当前时间
QDateTime dt = QDateTime::currentDateTime();
QString strTime = dt.toString("yyyyMMdd HHmmss.zzz");
QString ts = QString("<font color='gray'>[%1] </font>").arg(strTime);
QString coloredMessage = QString("<font color='%1'>%2</font>").arg(color).arg(msg);
switch (optType)
{
case ADD_TYPE_NOLINE:
{
ui.browserLogText->moveCursor(QTextCursor::End);
ui.browserLogText->insertHtml(coloredMessage);
}
break;
case ADD_TYPE_LINE:
{
ui.browserLogText->append(ts + coloredMessage);
}
break;
case ADD_TYPE_REPLACE_LINE:
{
// 获取当前的QTextCursor
QTextCursor cursor = ui.browserLogText->textCursor();
// 检查是否有选中的文本或光标是否在有效位置
if (!cursor.hasSelection() && cursor.position() != -1) {
// 定位到当前行的开始
cursor.movePosition(QTextCursor::StartOfLine);
// 保存当前行的开始位置
int start = cursor.position();
// 定位到当前行的结束(下一行的开始或文档末尾)
cursor.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor);
// 删除当前行
cursor.removeSelectedText();
// 将修改后的cursor设置回QTextBrowser
ui.browserLogText->setTextCursor(cursor);
// 设置新的行文本
ui.browserLogText->insertHtml(ts + coloredMessage);
}
}
break;
default:
break;
}
// Scroll to the end.
QScrollBar* verticalScrollBar = ui.browserLogText->verticalScrollBar();
verticalScrollBar->setValue(verticalScrollBar->maximum());
}
调试代码
窗口显示时,模拟文件下载进度。
void ShowLogDlg::showEvent(QShowEvent* event)
{
AppendLogMessage(QStringLiteral("开始下载文件"), "white", ADD_TYPE_LINE);
AppendLogMessage(QStringLiteral("当前进度:......0%"), "white", ADD_TYPE_LINE);
std::thread td([this]() {
for (int i = 1; i <= 100; i++)
{
sleep(100);
AppendLogMessage(QStringLiteral("当前进度:. . . . . . %1%").arg(i), "white", ADD_TYPE_REPLACE_LINE);
}
AppendLogMessage(QStringLiteral("下载完成"), "green", ADD_TYPE_LINE);
});
td.detach();
__super::showEvent(event);
}