官方文档:
<QtGlobal> - Global Qt Declarations | Qt Core 5.15.8
<QtGlobal> - Global Qt Declarations | Qt Core 6.2.4
#include <qapplication.h>
#include <stdio.h>
#include <stdlib.h>
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
QByteArray localMsg = msg.toLocal8Bit();
const char *file = context.file ? context.file : "";
const char *function = context.function ? context.function : "";
switch (type) {
case QtDebugMsg:
fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
break;
case QtInfoMsg:
fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
break;
case QtWarningMsg:
fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
break;
case QtCriticalMsg:
fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
break;
case QtFatalMsg:
fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
break;
}
}
int main(int argc, char **argv)
{
qInstallMessageHandler(myMessageOutput);
QApplication app(argc, argv);
...
return app.exec();
}
稍微改造下,保存到文件中
#include "mainwindow.h"
#include <QApplication>
#include <QLocale>
#include <QTranslator>
#include <QDateTime>
#include <QDir>
#include <QFile>
#include <QMutex>
#include <QTextStream>
QtMessageHandler g_DefaultHandler = nullptr;
void WriteLog(const QString foldername, const QString &msg)
{
static QMutex mutex;
QMutexLocker lock(&mutex);
QString path=QDir::currentPath()+"/Log/"+foldername+"/"+QDateTime::currentDateTime().toString("yyyyMM");
//判断路径是否存在
QDir dir(path);
if(dir.exists()==false)
{
//不存在,创建
dir.mkpath(path);
}
int i=1;
QString filename =path+"/log_"+QDateTime::currentDateTime().toString("dd")+ "_"+QString::number(i).rightJustified(3, '0') + ".txt";
while(true)
{
QFileInfo fi(filename);
if(fi.exists())
{
//文件过长
if(fi.size()>1024*10)
{
i++;
filename =path+"/log_"+QDateTime::currentDateTime().toString("dd")+ "_"+QString::number(i).rightJustified(3, '0') + ".txt";
continue;
}
else
break;
}
else
break;
}
//写入文件
QFile file(filename);
file.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream text_stream(&file);
text_stream << msg;
file.flush();
file.close();
}
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
QString file = context.file ? context.file : "";
QString function = context.function ? context.function : "";
QString text;
switch (type) {
case QtDebugMsg:
text =QString("【%1】Debug %2\r\n")
.arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")
,msg);
WriteLog("Info",text);
break;
case QtInfoMsg:
text =QString("【%1】Info %2 \r\n")
.arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")
,msg);
WriteLog("Info",text);
break;
case QtWarningMsg:
text =QString("【%1】Warning %2 %3 %4 \r\n%5\r\n")
.arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")
,file,function, QString::number(context.line)
,msg);
WriteLog("Error",text);
break;
case QtCriticalMsg:
text =QString("【%1】Critical %2 %3 %4 \r\n%5\r\n")
.arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")
,file,function, QString::number(context.line)
,msg);
WriteLog("Error",text);
break;
case QtFatalMsg:
text =QString("【%1】Fatal %2 %3 %4 \r\n%5\r\n")
.arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")
,file,function, QString::number(context.line)
,msg);
WriteLog("Error",text);
break;
}
//用系统原来的函数完成原来的功能. 比如输出到调试窗
if(g_DefaultHandler)
{
g_DefaultHandler(type,context,msg);
}
}
int main(int argc, char *argv[])
{
//注册MessageHandler
g_DefaultHandler = qInstallMessageHandler(myMessageOutput);
QApplication a(argc, argv);
qDebug("This is a debug message");
//qInfo("This is a info message");
//qWarning("This is a warning message");
//qCritical("This is a critical message");
//qFatal("This is a fatal message");
QTranslator translator;
const QStringList uiLanguages = QLocale::system().uiLanguages();
for (const QString &locale : uiLanguages) {
const QString baseName = "HMI_" + QLocale(locale).name();
if (translator.load(":/i18n/" + baseName)) {
a.installTranslator(&translator);
break;
}
}
MainWindow w;
w.show();
return a.exec();
}