Qt高级——Qt日志信息处理

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 <QWidget>
#include <QTextEdit>
#include <QHBoxLayout>
#include <QApplication>
#include <QMutex>
#include <QDateTime>

/**
 * @brief 日志组件
 */
class LogWidget : public QWidget
{
    Q_OBJECT
public:
    /**
     * @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 <QApplication>
#include <QDebug>
#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 <QApplication>
#include <QDebug>
#include <QTextStream>
#include <QDateTime>
#include <QFile>
#include <QString>
#include <QMutex>

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();
}

2、Qt日志文件

原文地址:http://blog.51cto.com/9291927/2134392

时间: 2024-10-09 04:43:50

Qt高级——Qt日志信息处理的相关文章

Qt高级——Qt信号槽机制源码解析

Qt高级--Qt信号槽机制源码解析 基于Qt4.8.6版本 一.信号槽机制的原理 1.信号槽简介 信号槽是观察者模式的一种实现,特性如下:A.一个信号就是一个能够被观察的事件,或者至少是事件已经发生的一种通知:B.一个槽就是一个观察者,通常就是在被观察的对象发生改变的时候--也可以说是信号发出的时候--被调用的函数:C.信号与槽的连接,形成一种观察者-被观察者的关系:D.当事件或者状态发生改变的时候,信号就会被发出:同时,信号发出者有义务调用所有注册的对这个事件(信号)感兴趣的函数(槽).信号和

Qt高级——Qt插件开发

Qt高级--Qt插件开发 一.Qt插件机制 1.Qt插件简介 插件是一种遵循一定规范的应用程序接口编写出来的程序,定位于开发实现应用软件平台不具备的功能的程序. 2.Qt插件API Qt提供了两种API用于创建插件:一种是高阶API,用于扩展Qt本身的功能,如自定义数据库驱动,图像格式,文本编码,自定义样式等:一种是低阶API,用于扩展Qt应用程序. 3.通过插件扩展应用程序功能 A.定义一个接口集(只有纯虚函数的类),用来与插件交流.B.用宏Q_DECLARE_INTERFACE()将该接口告

Qt高级——Qt数据可视化性能优化

Qt高级--Qt数据可视化性能优化 一.数据可视化简介 1.数据可视化简介 数据可视化即采用图形图表等对采集的数据进行展示,可以非常直观的查看传感器采集到的数据.本文将使用Qt的标准组件QTableWidget.标准模型.自定义模型分别实现对数据的表格展示. 2.系统环境 个人PC:ThinkPad T450操作系统:RHEL7.3 WorkStation内存容量:8G磁盘容量:SSD 100GCPU:Intel(R) Core(TM) i5-5200U CPU @ 2.20GHz 二.标准界面

QT高级编程技巧(二)-- 编写多线程和并发应用

学习QT多线程编程之前,有必要先熟悉事件循环的概念.先看一个单线程界面程序的主函数代码: int main(int argc, char* argv[]) { QApplication app(argc, argv); // 构造主窗口对象并显示 MainWindow w; w.show(); // 进入事件循环 return app.exec(); } 在程序初始化完成后,主线程进入main()函数开始执行应用代码.一般地,我们在主线程上构建界面对象,然后进入事件循环以处理控件绘制.用户输入.

Qt高级——QMake快速入门

Qt高级--QMake快速入门 一.QMake简介 qmake是Trolltech公司创建的用来为不同的平台和编译器书写Makefile的工具.qmake是一个用来简化在不同平台间开发工程的构建过程的工具.qmake会自动生成MakeFile文件,可以用于任何软件项目中,无论是否由Qt编写.qmake会注意所有的编译器和平台的依赖性,开发者只需关注自己的代码.qmake作为Qt库和Qt所提供的工具的主要连编工具,可以自动的包含moc和uic的连编规则. 二.QMake入门教程 1.创建一个工程

Qt高级——QTestLib单元测试框架

Qt高级--QTestLib单元测试框架 一.QTestLib简介 1.QTestLib简介 QTestLib是Qt提供的一种针对基于Qt编写的程序或库的单元测试框架.QTestLib提供了单元测试框架的基本功能,并提供了针对GUI测试的扩展功能. 2.QTestLib特性 QTestLib是为了简化QT程序或库的单元测试工作而设计的.QTestLib特性如下:A.轻量级:QTestlib只包含6000行代码和60个导出符号B.自包含:对于非GUI测试,QTestlib只需要Qt核心库的几个符号

Qt高级——QMake用户指南

Qt高级--QMake用户指南 本文翻译自Qt 4.8官方文档. 一.QMake使用 QMake提供了一个用于管理应用程序.库.其它组件的构建过程的面向工程系统.QMake扩展了每个工程文件的信息,生成一个执行编译和链接过程的必须命令的MakeFile. 1.描述工程 工程文件.pro描述了工程信息.工程文件信息会被qmake用于生成包含构建过程中所需的所有命令的MakeFile.工程文件通常包含一系列头文件和源文件,通用配置信息以及音乐程序指定的细节,如应用程序的链接库.搜索路径.工程文件包含

Qt高级——D-Bus快速入门

Qt高级--D-Bus快速入门 一.D-Bus简介 1.D-Bus简介 D-Bus是Desktop Bus的缩写,是针对桌面环境优化的IPC(InterProcess Communication)机制,用于进程间的通信或进程与内核的通信.D-Bus是为Linux系统开发的进程间通信(IPC)和远程过程调用(RPC)机制,使用统一的通信协议来代替现有的各种IPC解决方案.D-Bus允许系统级进程(如:打印机和硬件驱动服务)和普通用户进程进行通信.D-Bus使用一个快速的二进制消息传递协议,D-Bu

Qt高级——QtCreator常用快捷键

Qt高级--QtCreator常用快捷键 F1? ?? ??? 查看帮助 F2? ?? ??? 跳转到函数定义 Shift+F2? ? 声明和定义之间切换 F3 查找下一个 F4? ?? ??? 头文件和源文件之间切换 Ctrl+1? ?? ?? ? 欢迎模式 Ctrl+2? ?? ??? 编辑模式 Ctrl+3? ?? ??? 调试模式 Ctrl+4? ?? ??? 项目设置模式 Ctrl+5? ?? ??? 帮助模式? ?? Ctrl+6? ?? ??? 输出模式 Alt+0? ?? ???