【问题标题】:Custom and Default Message Handler in QtQt 中的自定义和默认消息处理程序
【发布时间】:2011-05-19 03:09:56
【问题描述】:

我想在将消息记录到除 qDebug 之外的日志文件时使用默认的 Qt 消息处理程序。 这是我的解决方案,您有什么建议或此实现可能存在哪些问题?

标题:

#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();
}

【问题讨论】:

  • 我认为这是一个很好的实现。但是,我会将其设为 Singleton,因为在正常用例中只有一个实例。从技术上讲,我会将构造函数设为私有,并提供一个返回类的静态对象的静态方法。

标签: c++ debugging qt logging


【解决方案1】:

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 的函数和一个用于包装日志记录的对象

【讨论】:

  • 我已经使用了静态函数,并且可以正常工作。我想知道有没有更合适的方法。
  • 不是我所知道的,我认为他们实现这一点的方式真的很混乱。但是通过将实例作为静态实例并将实际函数作为成员,您可以更轻松地保持本地状态,否则您实际上没有理由创建一个类,您还不如使用非成员函数。现在您正在为每次调用qDebug() 等进行cdopen
猜你喜欢
  • 2012-06-10
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
  • 2014-04-03
  • 2018-08-19
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多