一、QT的调试输出主要有以下几种:
qDebug : 调试信息提示
qWarning: 一般的警告提示
qCritical: 严重错误提示
qFatal: 致命错误提示
二、debug版的程序可以带着cmd窗口,供用户查看信息,但是release版本的时候不带cmd窗口,需要输出到日志中,但是程序中大量使用了qDebug,修改程序也比较麻烦,因此,可以在release版本的程序中,可以直接将qDebug重定向到日志文件中。经查询资料,整理出了log.h,只需要将其引用到工程中,在main.cpp中引入,使用的时候调用一下即可,具体如下:
log.h内容:
#ifndef LOG_H #define LOG_H #include <QFile> #include <QTextStream> #include <QDateTime> //默认调试级别为warning,即小于warning级别的都不会写入日志文件 //只有release版本的时候,才会输出到日志,debug版本正常输出到终端。 namespace QT_LOG { static int m_LogLevel = 1; static QString m_LogFile = QString("%1.log").arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmss")); QMutex m_LogMutex; void customMessageHandler(QtMsgType type, const char *msg) { if (type < m_LogLevel) { return; } QString log_info; switch (type) { case QtDebugMsg: log_info = QString("%1:%2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"),msg); break; case QtWarningMsg: log_info = QString("%1[Warning]:%2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"),msg); break; case QtCriticalMsg: log_info = QString("%1[Critical]:%2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"),msg); break; case QtFatalMsg: log_info = QString("%1[Fatal]:%2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"),msg); abort(); } m_LogMutex.lock(); QFile outFile(m_LogFile); outFile.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text); QTextStream ts(&outFile); ts << log_info << endl; outFile.close(); m_LogMutex.unlock(); } void logInit(QString logFile = "",int logLevel = 1) { #ifndef _DEBUG if ((logLevel < 0) || (logLevel > 3)) { m_LogLevel = 1; } else { m_LogLevel = logLevel; } if (!logFile.isEmpty()) { m_LogFile = logFile; } qInstallMsgHandler(customMessageHandler); #endif } }; #endif // LOG_H
main.cpp
#include "StackWidget.h" #include <QtGui/QApplication> #include "log.h" int main(int argc, char *argv[]) { if (argc > 1) { QT_LOG::logInit(QString(argv[0]).split(QDir::separator()).last().remove(".exe") + ".log",QString(argv[1]).toUInt()); } else { QT_LOG::logInit(QString(argv[0]).split(QDir::separator()).last().remove(".exe") + ".log"); } QApplication a(argc, argv); StackWidget w; w.show(); return a.exec(); }