Qt日志输出重定向,在静态函数发送信号,日志输出至控件或文件

本文介绍了如何使用Qt的qInstallMessageHandler函数实现日志重定向,通过设置静态指针和自定义日志输出函数,可以将程序日志发送到指定位置,如控制台、文件或其他自定义接收器。示例代码展示了如何将日志信息输出到文件,并在需要时触发信号进行日志显示。

程序日志输出是程序调试中不可缺少的一部分,使用Qt中的QtMessageHandler qInstallMessageHandler(QtMessageHandler handler)就可以将日志信息输出至自己想要的位置。

当有日志输出时,触发自定义的日志发送信号,此时接收该信号,即可将日志输出传递到任意位置,由于日志处理函数为静态函数,因此需要一个指针指向this,用于在静态函数中发送该信号。程序截图:

    

 完整示例Demo:Qt日志重定向输出https://github.com/zjgo007/QtDemo/tree/master/LogTesticon-default.png?t=LA92https://github.com/zjgo007/QtDemo/tree/master/LogTest

logwidget.h:

private:
    Ui::LogWidget *ui;
    static LogWidget* _pt;//静态指针,指向this,用于在静态函数中发送信号
    static bool outputToFile;//控制重定向方式
    static void myLogOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg);//日志重定向静态函数
    const  QtMessageHandler messageHandler = qInstallMessageHandler(nullptr);//输出至编译器中的messageHandle

signals:
    void logOutputed(QString log);

logwidget.cpp:

LogWidget* LogWidget::_pt = nullptr;//指针的初始化
bool LogWidget::outputToFile = false;

LogWidget::LogWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::LogWidget)
{
    ui->setupUi(this);
    _pt = this;//将指针指向 this
    connect(this,SIGNAL(logOutputed(QString)),this,SLOT(showLog(QString)));//连接重定向信号
    qInstallMessageHandler(LogWidget::myLogOutput);//注册重定向函数
}

LogWidget::~LogWidget()
{
    delete ui;
}

void LogWidget::myLogOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{

    static QMutex mutex;
    mutex.lock();
    QString textTypeStr;
    switch (type) {
    case QtDebugMsg:
        textTypeStr = "<<Debug>>";
        break;
    case QtInfoMsg:
        textTypeStr = "<<Info>>";
        break;
    case QtWarningMsg:
        textTypeStr = "<<Warning>>";
        break;
    case QtCriticalMsg:
        textTypeStr = "<<Critical>>";
        break;
    case QtFatalMsg:
        textTypeStr = "<<Fatal>>";
        break;
    }
//    QString context_info = QString("FILE:(%1) Line:(%2)").arg(QString(context.file),QString(context.line));
    QString current_data_time = QDateTime::currentDateTime().toString("[yyyy-MM-dd hh:mm:ss]");
    QString message = current_data_time+" "+textTypeStr+" "+" "+msg;
    if(outputToFile){//日志输出到文件
        QString LogName = "Log.txt";
        QFile file(LogName);
        file.open(QIODevice::WriteOnly | QIODevice::Append);
        QTextStream stream(&file);
        stream.setCodec("UTF-8");
        stream<<message<<"\r\n";
        file.close();
    }else{//发送日志信号
      emit _pt->logOutputed(message);
    }

    mutex.unlock();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

喵喵叫的猴

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

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

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

打赏作者

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

抵扣说明:

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

余额充值