zoukankan      html  css  js  c++  java
  • Qt 日志处理方法(qInstallMsgHandler函数)简单实用

    主要应用的函数

    QtMsgHandler qInstallMsgHandler(QtMsgHandler);

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

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

    以下是在代码中的简单应用:

    头文件实现:

     1 #ifndef MAINWINDOW_H
     2 #define MAINWINDOW_H
     3  
     4 #include <QMainWindow>
     5 #include <QtNetwork/QNetworkAccessManager>
     6 #include <QtNetwork/QNetworkReply>
     7 #include <QFile>
     8  
     9 //日志处理类
    10 class logger: public QObject
    11 {
    12     Q_OBJECT
    13 public:
    14     ~logger(){}
    15     static logger *_instance;
    16     static logger *instance();
    17  
    18 public:
    19     void loggerMaster(const QString &);
    20  
    21 signals:
    22     void G_sndMsg(const QString &);
    23  
    24 private:
    25     //将默认构造函数设置为私有
    26     logger(QObject *parent = 0):
    27         QObject(parent){}
    28 };
    29  
    30  
    31 //窗口类
    32 namespace Ui {
    33 class MainWindow;
    34 }
    35  
    36 class MainWindow : public QMainWindow
    37 {
    38     Q_OBJECT
    39     
    40 public:
    41     explicit MainWindow(QWidget *parent = 0);
    42     ~MainWindow();
    43     
    44 private slots:
    45     void on_pushButton_clicked();
    46     void S_disLog(const QString &);
    47     void S_updateProgress(qint64 _done, qint64 _total);
    48     void S_getZipData();
    49     void S_finishDown();
    50  
    51 private:
    52     Ui::MainWindow *ui;
    53     QNetworkAccessManager *manager;
    54     QNetworkReply *reply;
    55     bool isDownLoadOver;
    56     QFile   file;
    57 };
    58  
    59 #endif // MAINWINDOW_H

    cpp文件实现

      1 #include "mainwindow.h"
      2 #include "ui_mainwindow.h"
      3 #include <QTime>
      4 #include <QDebug>
      5  
      6 //-----------------------------------------日志处理部分开始
      7  
      8 //初始化静态变量
      9 logger * logger::_instance = 0;
     10  
     11 //构建单实例日志对象
     12 logger * logger::instance()
     13 {
     14     if(!logger::_instance)
     15         logger::_instance = new logger;
     16     return logger::_instance;
     17 }
     18  
     19  
     20 void logger ::loggerMaster(const QString & msg)
     21 {
     22     //在日志信息中加入时间标记
     23     QString newLog = QDateTime::currentDateTime().toString(QLatin1String("MM-dd hh:mm:ss:zzz"))
     24             + QLatin1Char(' ') + msg;
     25     //发送处理后的日志信息
     26     emit G_sndMsg(newLog);
     27 }
     28  
     29 //日志处理函数
     30 void logCatcher(QtMsgType type,const char* msg)
     31 {
     32     if(type == QtDebugMsg || type == QtWarningMsg)
     33         //将日志信息传递给logger处理函数
     34         logger::instance()->loggerMaster(QString::fromLocal8Bit(msg));
     35 }
     36  
     37  
     38 //------------------------------------------日志处理部分结束
     39  
     40  
     41  
     42 MainWindow::MainWindow(QWidget *parent) :
     43     QMainWindow(parent),
     44     isDownLoadOver(false),
     45     ui(new Ui::MainWindow)
     46 {
     47     ui->setupUi(this);
     48  
     49     //构建QNetworkAccessManager对象
     50     manager = new QNetworkAccessManager(this);
     51     //准备下载文件的地址:例如htp:htp://***.***.***.***/ze.zip
     52     QUrl url("ht*********-win32-2.0.1.zip");
     53     QNetworkRequest request(url);
     54     reply = manager->get(request);
     55  
     56  
     57     //更新现在进度条
     58     connect(reply,SIGNAL(downloadProgress(qint64,qint64)),SLOT(S_updateProgress(qint64,qint64)));
     59     //接收数据
     60     connect(reply,SIGNAL(readyRead()),SLOT(S_getZipData()));
     61     //提示接收数据完成
     62     connect(reply,SIGNAL(finished()),SLOT(S_finishDown()));
     63  
     64  
     65  
     66     //------------------------------------日志处理
     67     //注册日志处理函数
     68     qInstallMsgHandler(logCatcher);
     69     //连接日志,接收从logger实例中返回的日志信息
     70     connect(logger::instance(),SIGNAL(G_sndMsg(QString)),SLOT(S_disLog(QString)));
     71  
     72     file.setFileName("download.zip");
     73     //打开文件
     74     file.open(QIODevice::WriteOnly);
     75 }
     76  
     77 MainWindow::~MainWindow()
     78 {
     79     delete ui;
     80 }
     81  
     82 void MainWindow::on_pushButton_clicked()
     83 {
     84     close();
     85 }
     86  
     87 //将日志信息追加到QPlainTextEdit控件中
     88 void MainWindow::S_disLog(const QString & msg)
     89 {
     90     ui->plainTextEdit->appendPlainText(msg);
     91 }
     92  
     93  
     94 //更新进度条
     95 void MainWindow::S_updateProgress(qint64 _done, qint64 _total)
     96 {
     97     int qVal = qRound(_done/(double)_total * 100);
     98     if( qVal > 100 ) qVal = 100;
     99     ui->progressBar->setValue(qVal);
    100  
    101     qDebug()<<QString("已经下载文件的 \%%1").arg(QString::number(qVal,10));
    102       if(100 == qVal)
    103     {
    104         isDownLoadOver = true;
    105     }
    106 }
    107  
    108 //获取数据
    109 void MainWindow::S_getZipData(/*QNetworkReply *_relay*/)
    110 {
    111     if( reply->error() != QNetworkReply::NoError ) {
    112         qWarning() << tr("...文件下载失败...")+ reply->errorString();
    113         file.remove();
    114         ui->pushButton->setEnabled(true);
    115         return;
    116     }
    117  
    118     QByteArray bArray = reply->readAll();
    119  
    120     file.write(bArray);
    121 }
    122  
    123 //下载完成
    124 void MainWindow::S_finishDown()
    125 {
    126     if(isDownLoadOver)
    127     {
    128         qDebug() << (tr("...软件下载成功..."));
    129         ui->pushButton->setEnabled(true);
    130     }
    131 }

    实现效果:

  • 相关阅读:
    RAID技术
    Mysql的用户基本操作
    LNMP之Php的安装配置
    java 实现图片拼接
    java 实现Serv-U FTP 和 SFTP 上传 下载
    Image合并添加文字内容
    AOP切面用于系统日志
    网页评论实现
    java web 实体类生成
    java接口调试思想
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14687925.html
Copyright © 2011-2022 走看看