实现目的
完全仿照qDebug的打印方式,不对原有代码进行修改,如下:
qDebug() << 1 << "str" << 1.11;
避免qInstallMessageHandler可能带来的崩溃问题,文章位置https://blog.youkuaiyun.com/qq_34534425/article/details/115703971?spm=1001.2014.3001.5502
直接上代码
#ifdef qDebug
#undef qDebug
#endif
#ifdef qInfo
#undef qInfo
#endif
#ifdef qWarning
#undef qWarning
#endif
用于屏蔽Qt原有定义
class BasePrint
{
public:
virtual ~BasePrint(){}
template<class T>
BasePrint &operator<<(const T &t)
{
m_osStream << t << " ";
return *this;
}
std::ostringstream m_osStream;
};
基类核心代码,用于操作符重载
class qDebug: public BasePrint
{
public:
~qDebug()
{
DEBUG(m_osStream.str().c_str());
}
};
子类继承,可实现qInfo,qWarning等日志等级,在析构中统一输出日志。
一个猜测: qDebug() << 1 << "str" << 1.11;,这样的实现方式,qDebug的作用于只在;前,所以可以在析构中实现日志的统一输出,如果有清楚原理的朋友可探讨下。
完整代码链接
目前需要赚积分阶段,希望谅解,代码直接放到项目中可以使用。
把宏定义部分替换为自己的就行
两个版本:
版本一:只有头文件,包含路径就行,不需要添加到项目中
版本二:有.h和.cpp,可用于项目中实现日志的屏蔽,版本一的改良版