当前位置: 首页 > article >正文

Qt如何将系统中使用的qDebug、qWarning等输出的信息显示到自定义的界面上或保存到文件中

一、界面中添加一个QTextBrowser
在这里插入图片描述
二、相关源码
.hpp

#ifndef LOGLOOKWIDGET_H
#define LOGLOOKWIDGET_H

#include <QWidget>
#include <QMutex>
#include <iostream>
#include <QFile>
#include <QTextStream>
#include <QTime>
#include <QFontDialog>

namespace Ui {
class LogLookWidget;
}

class LogLookWidget : public QWidget
{
    Q_OBJECT
signals:
    void messageOutputSignal(QtMsgType type, int line, QString file, const QString &msg);
public:
    explicit LogLookWidget(QWidget *parent = nullptr);
    ~LogLookWidget();
private:
    void controlInit();
    static void messageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg);
private slots:
    void messageOutputSlot(QtMsgType type, int line, QString file, const QString &msg);
private:
    Ui::LogLookWidget *ui;

    static LogLookWidget *instance;
    QFile *logFile = nullptr;
    QTextStream *logStream = nullptr;
};

#endif // LOGLOOKWIDGET_H

.cpp

#include "logLookWidget.h"
#include "ui_logLookWidget.h"

LogLookWidget *LogLookWidget::instance = nullptr;


LogLookWidget::LogLookWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::LogLookWidget)
{
    ui->setupUi(this);
    instance = this;
    this->controlInit();
}

LogLookWidget::~LogLookWidget()
{
    qInstallMessageHandler(nullptr);
    delete ui;
}


void LogLookWidget::controlInit()
{
    this->setWindowTitle(tr("日志查看"));

    qInstallMessageHandler(LogLookWidget::messageOutput)

connect(instance,&LogLookWidget::messageOutputSignal,this,&LogLookWidget::messageOutputSlot);
}

void LogLookWidget::messageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    emit instance->messageOutputSignal(type,context.line,context.file,msg);
}

void LogLookWidget::messageOutputSlot(QtMsgType type, int line, QString file, const QString &msg)
{
    static QMutex mutex;
    mutex.lock();

    QString tag;
    QString time;
    QString fileAndLine;

    switch(type)
    {
    case QtDebugMsg:
        tag = QString("%1").arg("D/",-5);
        break;
    case QtInfoMsg:
        tag = QString("%1").arg("I/",-5);
        break;
    case QtWarningMsg:
        tag = QString("%1").arg("W/",-5);
        break;
    case QtCriticalMsg:
        tag = QString("%1").arg("E/",-5);
        break;
    case QtFatalMsg:
        tag = QString("%1").arg("F/",-5);
        break;
    }

    time = QString("%1").arg("["+QTime::currentTime().toString("hh:mm:ss.zzz")+"]",-15);

    fileAndLine = QString("%1").arg("("+file.split("\\").last()+":"+QString::number(line)+")",-35,' ');

    QString logMsg;
    logMsg.append(tag);
    logMsg.append("  ");
    logMsg.append(time);
    logMsg.append("  ");
    logMsg.append(fileAndLine);
    logMsg.append("  ");
    logMsg.append(msg);

   // std::cout<<logMsg.toStdString();
	//将信息显示到界面上
    this->ui->textBrowser->append(logMsg);
    logMsg.append("\n");
    //将信息保存到文件中
    if(this->logStream)
        *this->logStream<<logMsg;

    mutex.unlock();
}

注意:
1、函数messageOutput只能是静态成员函数或外部函数。
2、static LogLookWidget *instance的作用是通过信号与槽的方法将信息转到类内成员函数,从而完成将信息显示到界面。
3、qInstallMessageHandler(LogLookWidget::messageOutput)的作用是将信息输出载体转化到messageOutput这个函数上,对应的qInstallMessageHandler(nullptr);是取消。


http://www.kler.cn/a/450304.html

相关文章:

  • Docker之技术架构【八大架构演进之路】
  • 验证面试常见问题系列
  • Python基础知识回顾
  • Apache Jmeter Liunx环境部署与接口压测
  • Typesense:开源的高速搜索引擎
  • 多个方向说下nginx和apache的区别
  • 深度学习与图像处理(国产深度学习框架——飞桨官方指定教材)
  • springboot创建web项目
  • 【数据结构练习题】链表与LinkedList
  • 华中电子展(OVC)︱2025 武汉国际半导体产业与电子技术博览会:引领未来“芯”科技
  • AIDD - 人工智能药物设计 - 在 Docker 上创建和运行 PostgreSQL + RDKit 卡带环境
  • Java实现Excel带层级关系的数据导出功能
  • 最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解TP1-TP10及工程应用---盘式制动器设计,提供完整MATLAB代码
  • List 集合安全操作指南:避免 ConcurrentModificationException 与提升性能
  • 模型高效微调方式
  • Mysql-索引数据结构选择合理性
  • KingbaseES(金仓数据库)入门学习
  • 如何在 Ubuntu 22.04 服务器上安装 Jenkins
  • 【LuaFramework】LuaFramework_UGUI_V2框架学习
  • 精彩回顾|在2024全球智博会 Semantic Kernel 开发者日中国站开启企业全智能化应用场景