天天看點

Qt 日志處理方法(qInstallMsgHandler函數)簡單實用

作者:QT進階進階

主要應用的函數

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           

【領QT開發教程學習資料,點選下方連結莬費領取↓↓,先碼住不迷路~】

點選→領取「連結」

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 }           

實作效果:

Qt 日志處理方法(qInstallMsgHandler函數)簡單實用

繼續閱讀