用 QPlainTextEdit 实现一个日志控制台(带源码)

背景

由于我们的程序在使用时,在进行串口通信或者网络通信时,想实时的看到关键日志信息或者错误信息,所以需要在软件中集成一个日志控制台的功能。

参考 visual studio和 qtcreator等各种IDE,在IDE的下面都会有一个日志输出窗口,而本次我们也使用QPlainTextEdit 来实现一个简单的日志输出窗口。

程序

#pragma once

#include <QWidget>
#include <QPlainTextEdit>

class QPlainTextEdit;
class LogWidget : public QWidget
{
    Q_OBJECT

public:
    explicit LogWidget(QWidget* parent = nullptr);
    ~LogWidget();

public:
    void setMaxRow(uint32_t newMaxRow);
    uint32_t getMaxRow()const;

    void clear();
    void append(const QString& text, const QString& type = QString("Info"),
                const QColor& color = QColor(100, 184, 255));

private:
    uint32_t m_totalRow = 0;
    uint32_t m_maxRow = 1000;
    QPlainTextEdit* m_edit = nullptr;
    QTextCharFormat fmt;
};

#include <QVBoxLayout>
#include <QDateTime>
#include "logwidget.h"

LogWidget::LogWidget(QWidget* parent):
    QWidget(parent)
{
    auto box = new QVBoxLayout(this);
    box->setSpacing(0);
    box->setMargin(3);

    m_edit = new QPlainTextEdit(this);
    m_edit->setReadOnly(false);
    m_edit->setUndoRedoEnabled(false);
    box->addWidget(m_edit);

    setContentsMargins(2, 10, 2, 10);
}

LogWidget::~LogWidget()
{
}

void LogWidget::setMaxRow(uint32_t newMaxRow)
{
    m_maxRow = newMaxRow;
}

uint32_t LogWidget::getMaxRow() const
{
    return m_maxRow;
}

void LogWidget::clear()
{
    m_totalRow = 0;
    m_edit->clear();
}

void LogWidget::append(const QString& text, const QString& type, const QColor& color)
{
    auto time = QTime::currentTime().toString("HH:mm:ss zzz");
    fmt.setForeground(QBrush(color));
    m_edit->mergeCurrentCharFormat(fmt);

    QString content = QString("[%1][%2]%3").arg(time, type, text);
    m_edit->appendPlainText(content);
    m_edit->moveCursor(QTextCursor::End);//移动光标到最后一行
    m_totalRow ++;
    if (m_totalRow >= m_maxRow) {
        auto cursor = m_edit->textCursor();
        cursor.setPosition(0);
        cursor.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor);
        cursor.movePosition(QTextCursor::Down, QTextCursor::KeepAnchor);
        cursor.movePosition(QTextCursor::StartOfLine, QTextCursor::KeepAnchor);
        cursor.removeSelectedText();
    }
}

说明

此widget支持设置最大显示行数。并支持根据不同的日志等级显示不同的颜色,支持显示日志的执行时间。

此widget可以当作一个基础的UI组件,可被QT程序加载到任何想显示的布局里面,比如添加到dockwidget中可被拖动。

关于为什么选择 QPlainTextEdit 而不是 QTextEdit,有以下2个原因:

1、我们的日志是纯文本内容,所以QPlainTextEdit就够了。
2、在段落布局上,QPlainTextEdit 的性能是高于QTextEdit的,我这边是测试验证过的,在大量数据的时候,QPlainTextEdit 在dockwidget中进行拖动就不会卡顿,而QTextEdit卡顿非常严重。

其他

当然,如果想要增加查找功能也比较简单,创建一个dialog,包含一个 lineedit,或者使用 QInputDialog 更方便,然后在dialog的按钮事件中执行下面的代码:

void LogWidget::find()
{
    bool ok;
      QString text = QInputDialog::getText(this, 查找"),
                                           tr("内容:"), QLineEdit::Normal,
                                           QDir::home().dirName(), &ok);
      if (ok && !text.isEmpty())
          {
              show_findText(text);
          }
}

void LogWidget::show_findText(const QString& findtext)
{
    if(m_edit->find(findtext,QTextDocument::FindBackward))//查找后一个
    {
        // 查找到后高亮显示
        QPalette palette = m_edit->palette();
        palette.setColor(QPalette::Highlight,palette.color(QPalette::Active,QPalette::Highlight));
        m_edit->setPalette(palette);
    }
    else
    {
        QMessageBox::information(this,("注意"),("没有找到内容"),QMessageBox::Ok);
    }
}

在这里插入图片描述

关注公众号 QTShared,带你探索更多 C++/QT 相关知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

q2nAmor

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值