c++ - qInstallMessageHandler 不接受公共方法作为参数
问题描述
我正在使用Qt 5.7开发一个项目,但遇到LtLogger
类问题:
#ifndef LTLOGGER_H
#define LTLOGGER_H
#include <QObject>
#include <QScopedPointer>
#include <QFile>
#include <QMutexLocker>
#include <QDateTime>
#include <QThread>
#include <QMutex>
#include <QApplication>
#include <utils/config.h>
#include "ltlogsocket.h"
/**
* @brief Log backup folder name
*/
static const QString LT_LOG_BACKUP_FOLDER_NAME="logBackup";
#ifdef PLATFORM_NEXO360
/**
* @brief Log file name
*/
static const QString LT_LOG_FILE_NAME="dc.log";
#endif
/**
* @class Logger class
*/
class LtLogger : public QObject
{
Q_OBJECT
public:
/**
* @brief Constructor
* @param parent
*/
explicit LtLogger(QObject* const parent,
Config* const ltConfig);
/**
* @brief Message handler method
* @param type
* @param ctx
* @param msg
*/
void ltMessageHandler(QtMsgType type,
const QMessageLogContext& ctx,
const QString& msg);
signals:
public slots:
};
#endif // LTLOGGER_H
及其实施:
#include "ltlogger.h"
LtLogger::LtLogger(QObject *parent,
Config* const ltConfig)
: QObject(parent),
m_ltLogSocket(new LtLogSocket(parent,
ltConfig))
{
qInstallMessageHandler(ltMessageHandler);
} // constructor
void LtLogger::ltMessageHandler(QtMsgType type,
const QMessageLogContext& ctx,
const QString& msg)
{
QString func = ctx.function;
func = func.left(func.lastIndexOf("("));
func = func.mid(func.indexOf(" "));
func = func.mid(func.indexOf("::")+2);
QString currTime = QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz");
QString txt;
switch (type) {
case QtInfoMsg:
txt = QString("%1 [%2] %3/%4: %5").arg(currTime).arg(QThread::currentThread()->objectName()).arg("I").arg(func).arg(msg);
break;
case QtDebugMsg:
txt = QString("%1 [%2] %3/%4: %5").arg(currTime).arg(QThread::currentThread()->objectName()).arg("D").arg(func).arg(msg);
break;
case QtWarningMsg:
txt = QString("%1 %2/%3: %4").arg(currTime).arg("W").arg(func).arg(msg);
break;
case QtCriticalMsg:
txt = QString("%1 %2/%3 (%4.%5): %6").arg(currTime).arg("C").arg(func).arg(ctx.file).arg(ctx.line).arg(msg);
break;
case QtFatalMsg:
txt = QString("%1 %2/%3 (%4.%5): %6").arg(currTime).arg("F").arg(func).arg(ctx.file).arg(ctx.line).arg(msg);
abort();
}
QTextStream ts(m_ltLogFile.data());
ts << txt << endl;
ts.flush(); // Clear the buffered data
ltCleanupLogs();
} // ltMessageHandler
当我尝试构建项目时,出现以下错误:
ltlogger.cpp: In constructor ‘LtLogger::LtLogger(QObject*, Config*)’:
ltlogger.cpp:9:44: error: invalid use of non-static member function ‘void LtLogger::ltMessageHandler(QtMsgType, const QMessageLogContext&, const QString&)’
qInstallMessageHandler(ltMessageHandler);
我缺少什么,如何将成员方法注册为消息处理程序,我在构造函数中尝试过,从代码中可以看出。
解决方案
编译器给出了正确的提示。QtMessageHandler 是一个独立的函数:
typedef void (*QtMessageHandler)(QtMsgType, const QMessageLogContext &, const QString &);
您可以像这样使用您的处理程序:
LtLogger globalLogger;
void messageHandler(QtMsgType type, const QMessageLogContext& ctx, const QString& msg){
globalLogger.ltMessageHandler(type, ctx, msg);
}
[...]
qInstallMessageHandler(messageHandler);
推荐阅读
- node.js - RaspberryPI 上的节点应用程序 setInterval() 随机停止...再次
- grpc - 使用proto3版本时生成pb文件失败。[Nodejs]
- dart - 在飞镖中向int添加点
- python - OpenCV - 如何检测两个矩形之间的交叉点?
- html - 如何从选项选择列表中删除/跳过空行
- python - 是否可以访问保存在 Django 视图中的目录中的泡菜文件?
- sql - 如何阻止 grafana 将十六进制字符串转换为整数?
- c# - Razor 页面登录表单在输入字段内添加图标
- c# - 无法将 TextBox 设置为焦点
- firebase - Firebase 聊天 - 需要建议