Qt自定义qDebug输出

qDebug默认输出字符串+换行

想要输出文件名,函数名,行号需要自定义,

如下是输出到文件,并且打印到控制台

//自定义消息处理函数
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    QDateTime time = QDateTime::currentDateTime();
    QString strTime = time.toString("yyyy-MM-dd hh:mm:ss.zzz");
    QString strMessage = QString("[%1] %2 (%3) %4")
        .arg(strTime).arg(context.file).arg(context.line).arg(context.function);
    QString strMsg;
    switch(type)
    {
    case QtDebugMsg:
        strMsg = QString(" [Debug] ");
        break;
    case QtInfoMsg:
        strMsg = QString(" [Info] ");
        break;
    case QtWarningMsg:
        strMsg = QString(" [Warning] ");
        break;
    case QtCriticalMsg:
        strMsg = QString(" [Critical] ");
        break;
    case QtFatalMsg:
        strMsg = QString(" [Fatal] ");
        break;
    default:
        strMsg = QString(" [Err]");
        break;
    }
    strMessage = strMessage + strMsg + msg;

    if(type>QtDebugMsg)
    {
        //加锁输出文件
        static QMutex mutex;
        mutex.lock();
        QFile file(".\\test.log");
        file.open(QIODevice::WriteOnly|QIODevice::Append);
        QTextStream stream(&file);
        stream << strMessage << "\r\n";
        file.flush();
        file.close();
        mutex.unlock();
    }

    //同时用系统原来的函数完成输出打印
    FILE* device = stdout;
    if(type>QtInfoMsg)
    {
        device = stderr;
    }

    QTextStream outputStream(device);
    outputStream.setCodec(QTextCodec::codecForName("System"));
    outputStream<<strMessage.toLocal8Bit();
    outputStream.flush();
}

注意:打印到控制台如果有中文,可能会乱码,所以一定要加上

outputStream.setCodec(QTextCodec::codecForName("System"));

不写system的话写GBK也可以的,但是System看起来伟大一点,

用法:main函数中调用

qInstallMessageHandler(myMessageOutput);

需要引用

#include <QTextCodec>
#include <QtDebug>
#include <QMutex>
。。。。
发布了275 篇原创文章 · 获赞 46 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/youyudexiaowangzi/article/details/103421847