Qt高级——Qt日志信息处理
发表于:2024-11-30 作者:热门IT资讯网编辑
编辑最后更新 2024年11月30日,Qt高级--Qt日志信息处理一、Qt日志功能简介Qt有Debug、Warning、Critical、Fatal四种级别的调试信息。qDebug:调试信息qWarning:警告信息qCritical:严
Qt高级--Qt日志信息处理
一、Qt日志功能简介
Qt有Debug、Warning、Critical、Fatal四种级别的调试信息。
qDebug:调试信息
qWarning:警告信息
qCritical:严重错误
qFatal:致命错误
Qt4提供了qInstallMsgHandler(Qt5:qInstallMessageHandler)对qDebug、qWarning、qCritical、qFatal等函数输出信息的重定向处理。
qInstallMsgHandler是一个回调函数,由qDebug、qWarnng、qCritical、qFatal函数进行触发,qDebug、qWarnng、qCritical、qFatal函数处理的消息文本会被qInstallMsgHandler所指向的回调函数截获,允许用户自己来处理输出的消息文本。
二、Qt日志输出组件
1、Qt日志输出组件定义
定制一个日志信息输出组件。
LogWidget.h文件:
#ifndef LOGWIDGET_H#define LOGWIDGET_H#include #include #include #include #include #include /** * @brief 日志组件 */class LogWidget : public QWidget{ Q_OBJECTpublic: /** * @brief 获取单例 * @return */ static LogWidget* getInstance(); /** * @brief 日志信息输出函数 * @param type 参数,日志信息的级别 * @param msg 参数,日志信息的内容 */ void outputMessage(QtMsgType type, const char *msg);protected: explicit LogWidget(QWidget *parent = NULL); /** * @brief 打印日志信息 * @param msg 输入参数,日志信息 */ void printMessage(const QString& msg);private: static LogWidget* m_instance;//单例 QTextEdit* m_textEdit;//日志输出多行文本框};#endif // LOGWIDGET_H
LogWidget.cpp文件:
#include "LogWidget.h"LogWidget* LogWidget::m_instance = NULL;LogWidget *LogWidget::getInstance(){ if(m_instance == NULL) { m_instance = new LogWidget(); } return m_instance;}void LogWidget::printMessage(const QString &msg){ m_textEdit->append(msg);}LogWidget::LogWidget(QWidget *parent) : QWidget(parent){ m_textEdit = new QTextEdit(this); m_textEdit->setReadOnly(true); QHBoxLayout* layout = new QHBoxLayout; layout->addWidget(m_textEdit); setLayout(layout); resize(600, 200);}void LogWidget::outputMessage(QtMsgType type, const char *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:"); break; } QString message = QString("[%1] %2 %3").arg( QDateTime::currentDateTime().toString( "yyyy-MM-dd hh:mm:ss ddd")).arg(text).arg(msg); printMessage(message); mutex.unlock();}
2、Qt日志输出组件的使用
#include #include #include "LogWidget.h"/** * @brief 日志输出回调函数 * @param type 参数,日志消息的级别 * @param msg 参数,日志消息 */void outputMessage(QtMsgType type, const char *msg){ LogWidget::getInstance()->outputMessage(type, msg);}int main(int argc, char *argv[]){ //注册日志消息回调函数 qInstallMsgHandler(outputMessage); QApplication a(argc, argv); LogWidget::getInstance()->show(); // 打印信息 qDebug("This is a debug message."); qWarning("This is a warning message."); qCritical("This is a critical message."); //linux调用qFatal会导致coredump //qFatal("This is a fatal message"); return a.exec();}
3、Qt日志组件示例
三、Qt日志文件输出
1、Qt日志文件输出
#include #include #include #include #include #include #include void outputMessage(QtMsgType type, const char* 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(__FILE__).arg(__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); QFile file("log.txt"); file.open(QIODevice::WriteOnly | QIODevice::Append); QTextStream out(&file); out << message << "\n"; file.flush(); file.close(); mutex.unlock();}int main(int argc, char *argv[]){ QApplication app(argc, argv); //注册MessageHandler qInstallMsgHandler(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"); return app.exec();}