QT日志调试系统(前台、后台、文件查看调试信息)

在这里插入图片描述
通过qInstallMessageHandler获取Qt的打印信息,将这些打印信息存放到一个Widget中,实现不通过后台就能查看日志信息。
实现方法如下:
main.cpp

#include "mainwidget.h"
#include <QApplication>
#include <QStyleFactory>
#include "logwidget.h"

void logOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    LogWidget::instance()->myMessageOutput(type,context,msg);
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QApplication::setStyle(QStyleFactory::create("Fusion"));

    bool ok = false;
    QSharedMemory sharedMemory("testApp");
    if (sharedMemory.attach(QSharedMemory::ReadOnly))
    {
        sharedMemory.detach();
    }

    if (sharedMemory.create(1))
    {
        LogWidget::instance()->show();
        qInstallMessageHandler(logOutput);
        MainWidget w;
        w.move(0,0);
        w.show();

        ok = a.exec();
        if (sharedMemory.isAttached())
            sharedMemory.detach();
    }

    return ok;
}

以下代码中记录了前台、后台、文件查看调试信息
logwidget.cpp

#include "logwidget.h"
#include <QDateTime>
#include <QApplication>
#include <QDir>
#include <QTextStream>
#include <QHBoxLayout>

QMutex LogWidget::m_mutex;
LogWidget* LogWidget::m_Instance = nullptr;

LogWidget::LogWidget(QWidget *parent) :
    QWidget(parent)
{
    this->setWindowFlags(Qt::WindowStaysOnTopHint|Qt::WindowCloseButtonHint|Qt::WindowMaximizeButtonHint);
    m_textEdit = new QTextEdit(this);
    QHBoxLayout* lay = new QHBoxLayout(this);
    lay->addWidget(m_textEdit);
    this->setLayout(lay);

    connect(this,&LogWidget::sig_logUpdate,this,[&](QString msg)
    {
        m_textEdit->append(msg);
    });
}

LogWidget::~LogWidget()
{
}

LogWidget *LogWidget::instance()
{
    if (m_Instance == NULL)
    {
        m_mutex.lock();
        if (m_Instance == NULL)
        {
            m_Instance = new LogWidget();
        }
        m_mutex.unlock();
    }
    return m_Instance;
}

void LogWidget::myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
#if 1
    // 加锁
    static QMutex mutex;
    mutex.lock();

    QByteArray localMsg = msg.toLocal8Bit();

    QString strMsg("");
    switch(type)
    {
    case QtDebugMsg:
        strMsg = QString("Debug:");
        break;
    case QtWarningMsg:
        strMsg = QString("Warning:");
        break;
    case QtCriticalMsg:
        strMsg = QString("Critical:");
        break;
    case QtFatalMsg:
        strMsg = QString("Fatal:");
        break;
    }

    // 设置输出信息格式
    QString strDateTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
    QString strMessage = QString("DateTime:%1:%2 \t\t(line:%3) (File:%4)").arg(strDateTime)
            .arg(localMsg.constData()).arg(context.line).arg(context.file);

    //打印输出窗口显示调试信息
    fprintf(stderr, "%s\n", strMessage.toLatin1().data());
    //前台Widget显示调试信息
    emit sig_logUpdate(strMessage);
    // 输出调试信息至文件中(读写、追加形式)
    QDir dir(QApplication::applicationDirPath()+"/log");
    if (!dir.exists())
        dir.mkpath(dir.path());
    QString logName = dir.path() + "/log_"+QDate::currentDate().toString("yyyy-MM-dd")+".txt";
    QFile file(logName);
    file.open(QIODevice::ReadWrite | QIODevice::Append);
    QTextStream stream(&file);
    stream << strMessage << "\r\n";
    file.flush();
    file.close();

    // 解锁
    mutex.unlock();
#endif
}

logwidget.h

#ifndef LOGWIDGET_H
#define LOGWIDGET_H

#include <QWidget>
#include <QTextEdit>
#include <QMutex>

class LogWidget : public QWidget
{
    Q_OBJECT

public:
    ~LogWidget();
    static LogWidget *instance();
    void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg);

signals:
    void sig_logUpdate(QString msg);
private:
    explicit LogWidget(QWidget *parent = nullptr);
    static QMutex m_mutex;
    static LogWidget* m_Instance;
    QTextEdit* m_textEdit = nullptr;
};

#endif // LOGWIDGET_H

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

东方忘忧

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

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

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

打赏作者

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

抵扣说明:

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

余额充值