Qt中利用QTextBrowser控件设计日志窗口

来自:网络
时间:2024-09-10
阅读:

我们一般使用Qt开发应用程序时,都有将控制台窗口去掉。但是,有时候又需要查看一些调试信息,一般的处理方式是把log写到一个文件中。本文介绍一下日志窗口,可以更方便的查看日志信息。

UI设计

推拽UI控件,修改默认背景。

Qt中利用QTextBrowser控件设计日志窗口

日志打印接口

目前仅支持三种操作,可根据需要扩展。

/*
 * 文档操作方式
 */
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);
}

运行效果

Qt中利用QTextBrowser控件设计日志窗口

到此这篇关于Qt中利用QTextBrowser控件设计日志窗口的文章就介绍到这了,更多相关Qt中利用QTextBrowser控件设计日志窗口内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持! 

返回顶部
顶部