网上的都是 控制台程序的 日志输出。这个是实用时 带界面那种的 日志输出。以后会专门整一个日志类,会更加方便。
.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QDebug>
#include <QFile>
#include <QMutex>
#include <QDateTime>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
static MainWindow* s_this;
QFile *file;
QTextStream *text_stream;
MainWindow(QWidget *parent = nullptr);
static void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow* MainWindow::s_this = nullptr;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
s_this=this;
file=new QFile{"./alarm.txt"};
file->open(QIODevice::WriteOnly | QIODevice::Append);
text_stream=new QTextStream{file};
qInstallMessageHandler(this->outputMessage);
qDebug("This is a debug message");
qWarning("This is a warning message");
qCritical("This is a critical message");
//qFatal("This is a fatal message");
}
void MainWindow::outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
static QMutex mutex;
mutex.lock();
QString text;
switch(type)
{
case QtDebugMsg:
text = QString("Debug:");
break;
case QtWarningMsg:
text = QString("Warning:");
break;
case QtCriticalMsg:
text = QString("Critical:");
break;
case QtFatalMsg:
text = QString("Fatal:");
}
QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line);
QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");
QString current_date = QString("(%1)").arg(current_date_time);
QString message = QString("%1 %2 %3 %4").arg(text).arg(context_info).arg(msg).arg(current_date);
//s_this->file->write(message.toLatin1()); //这个也可以使用,file的write 或者 下面stream的输入那个顺手用哪个吧
s_this->text_stream->operator<<(message);
s_this->text_stream->operator<<("\r\n");
s_this->file->flush(); //必须加,不然会有问题
mutex.unlock();
}
MainWindow::~MainWindow()
{
file->close();
delete ui;
}
注意:
1)在编译release版本的时候日志文件中部分内容会为空,比如文件名、函数名和文件行数,因为Qt默认会去掉相关信息,解决方法是在pro文件中添加宏定义 DEFINES += QT_MESSAGELOGCONTEXT,如果是VS开发环境在配置项的C++预编译器中添加此宏,release版本的日志中就会有相关信息