Пользовательский и стандартный обработчик сообщений в Qt - PullRequest
5 голосов
/ 02 декабря 2010

Я хочу использовать обработчик сообщений Qt по умолчанию при записи сообщений в файл журнала, кроме qDebug.Вот мое решение, у вас есть какие-либо предложения или каковы возможные проблемы с этой реализацией?

Заголовок:

#ifndef QLOGGER_H
#define QLOGGER_H

#include <QtCore/QObject>
#include <QtCore/QFile>
#include <QtCore/QDateTime>

class QLogger : public QObject
{
Q_OBJECT

public:
    QLogger();
   ~QLogger();

    static void start();
    static void finish();
    static QString filename;

private:
    static void myloggerfunction(QtMsgType type, const char *msg);

};

#endif // QLOGGER_H

Источник:

#include <QTextStream>
#include <QDateTime>
#include <QDir>
#include <iostream>

#include "qlogger.h"

using namespace std;

QString QLogger::filename=QString("log.txt");

QLogger::QLogger()
{
}

QLogger::~QLogger()
{
}

void QLogger::start()
{
    qInstallMsgHandler(myloggerfunction);
}

void QLogger::finish()
{
    qInstallMsgHandler(0);
}

void QLogger::myloggerfunction(QtMsgType type, const char *msg)
{
    QDir dir;
    dir.cd("LOG");

    QFile logFile(filename);

    if (logFile.open(QIODevice::Append | QIODevice::Text))
    {
        QTextStream streamer(&logFile);

        switch (type){
                 case QtDebugMsg:
                     finish();
                     qDebug(msg);
                     break;
                 case QtWarningMsg:
                     streamer << QDateTime::currentDateTime().toString() <<" Warning: " << msg <<  "\n";
                     finish();
                     qWarning(msg);
                     break;
                 case QtCriticalMsg:
                     streamer << QDateTime::currentDateTime().toString() <<" Critical: " << msg <<  "\n";
                     finish();
                     qCritical(msg);
                     break;
                 case QtFatalMsg:
                     streamer << QDateTime::currentDateTime().toString() <<" Fatal: " << msg <<  "\n";
                     finish();
                     qFatal(msg);
                     break;
        }
        logFile.close();
    }
    start();
}

1 Ответ

5 голосов
/ 03 декабря 2010

Afaik, это не сработает, вы реализуете функцию обработчика сообщений как функцию-член объекта, сигнатура функции, которую qInstallMessageHandler принимает, равна void myMsgHandler(QtMsgType, const char *);

. Вы можете реализоватьфункция в виде простой автономной функции или использование синглтона со статическим аксессором, например

void msgHandler(QtMsgType type, const char * msg)
{
   Logger::instance()->handleMessage(type,msg);
}

class Logger
{
  static Logger* instance() {... }
  void handleMessage(QtMsgType type, const char* msg) { ... }
}

, что дает вам функцию, которую нужно использовать для qInstallMsgHandler, и объект для переноса записи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...