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

 

 主要应用的函数

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_OBJECT
public:
    ~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);
    }
}


实现效果:

 

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

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值