Q编程6:Qt日志处理方法(qInstallMsgHandler函数)简单实用

来源:互联网 发布:东华大学网络教育平台 编辑:程序博客网 时间:2024/05/29 19:26

 

 主要应用的函数

QtMsgHandler qInstallMsgHandler(QtMsgHandler);

 

其中QtMsgHandler是函数指针,原型为

typedef void (*QtMsgHandler)(QtMsgType, const char *);

 

以下是在代码中的简单应用(以QNetWorkAccessManager 下载文件为例):


头文件实现:

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QtNetwork/QNetworkAccessManager>#include <QtNetwork/QNetworkReply>#include <QFile>//日志处理类class logger: public QObject{    Q_OBJECTpublic:    ~logger(){}    static logger *_instance;    static logger *instance();public:    void loggerMaster(const QString &);signals:    void G_sndMsg(const QString &);private:    //将默认构造函数设置为私有    logger(QObject *parent = 0):        QObject(parent){}};//窗口类namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{    Q_OBJECT    public:    explicit MainWindow(QWidget *parent = 0);    ~MainWindow();    private slots:    void on_pushButton_clicked();    void S_disLog(const QString &);    void S_updateProgress(qint64 _done, qint64 _total);    void S_getZipData();    void S_finishDown();private:    Ui::MainWindow *ui;    QNetworkAccessManager *manager;    QNetworkReply *reply;    bool isDownLoadOver;    QFile   file;};#endif // MAINWINDOW_H


cpp文件实现

#include "mainwindow.h"#include "ui_mainwindow.h"#include <QTime>#include <QDebug>//-----------------------------------------日志处理部分开始//初始化静态变量logger * logger::_instance = 0;//构建单实例日志对象logger * logger::instance(){    if(!logger::_instance)        logger::_instance = new logger;    return logger::_instance;}void logger ::loggerMaster(const QString & msg){    //在日志信息中加入时间标记    QString newLog = QDateTime::currentDateTime().toString(QLatin1String("MM-dd hh:mm:ss:zzz"))            + QLatin1Char(' ') + msg;    //发送处理后的日志信息    emit G_sndMsg(newLog);}//日志处理函数void logCatcher(QtMsgType type,const char* msg){    if(type == QtDebugMsg || type == QtWarningMsg)        //将日志信息传递给logger处理函数        logger::instance()->loggerMaster(QString::fromLocal8Bit(msg));}//------------------------------------------日志处理部分结束MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    isDownLoadOver(false),    ui(new Ui::MainWindow){    ui->setupUi(this);    //构建QNetworkAccessManager对象    manager = new QNetworkAccessManager(this);    //准备下载文件的地址:例如htp:htp://***.***.***.***/ze.zip    QUrl url("ht*********-win32-2.0.1.zip");    QNetworkRequest request(url);    reply = manager->get(request);    //更新现在进度条    connect(reply,SIGNAL(downloadProgress(qint64,qint64)),SLOT(S_updateProgress(qint64,qint64)));    //接收数据    connect(reply,SIGNAL(readyRead()),SLOT(S_getZipData()));    //提示接收数据完成    connect(reply,SIGNAL(finished()),SLOT(S_finishDown()));    //------------------------------------日志处理    //注册日志处理函数    qInstallMsgHandler(logCatcher);    //连接日志,接收从logger实例中返回的日志信息    connect(logger::instance(),SIGNAL(G_sndMsg(QString)),SLOT(S_disLog(QString)));    file.setFileName("download.zip");    //打开文件    file.open(QIODevice::WriteOnly);}MainWindow::~MainWindow(){    delete ui;}void MainWindow::on_pushButton_clicked(){    close();}//将日志信息追加到QPlainTextEdit控件中void MainWindow::S_disLog(const QString & msg){    ui->plainTextEdit->appendPlainText(msg);}//更新进度条void MainWindow::S_updateProgress(qint64 _done, qint64 _total){    int qVal = qRound(_done/(double)_total * 100);    if( qVal > 100 ) qVal = 100;    ui->progressBar->setValue(qVal);    qDebug()<<QString("已经下载文件的 \%%1").arg(QString::number(qVal,10));      if(100 == qVal)    {        isDownLoadOver = true;    }}//获取数据void MainWindow::S_getZipData(/*QNetworkReply *_relay*/){    if( reply->error() != QNetworkReply::NoError ) {        qWarning() << tr("...文件下载失败...")+ reply->errorString();        file.remove();        ui->pushButton->setEnabled(true);        return;    }    QByteArray bArray = reply->readAll();    file.write(bArray);}//下载完成void MainWindow::S_finishDown(){    if(isDownLoadOver)    {        qDebug() << (tr("...软件下载成功..."));        ui->pushButton->setEnabled(true);    }}


实现效果:

 

//以上我在做软件更新的时候用到过。

 

 

0 0