qInstallMessageHandler 指向外部库方法的指针

qInstallMessageHandler pointer to external lib method

** 我关注了:http://www.qt-coding.com/2013/08/06/tip-of-the-day-redirect-qdebug-to-a-file/

我创建了一个方法:

MyLogging(QtMsgType type, const QMessageLogContext &context, const QString &msg);

它位于我的主项目的外部库(我创建的)中。

当我执行以下操作时:

qInstallMessageHandler(MyLib::MyLogging);

编译器说它不能转换:

error: C2664: 'QtMessageHandler qInstallMessageHandler(QtMessageHandler)' : cannot convert argument 1 from 'void (__cdecl MyLib::* )(QtMsgType,const QMessageLogContext &,const QString &)' to 'QtMessageHandler 没有可以进行这种转换的上下文'

但是如果我将我的 MyLogging 方法与 main.cpp 内联,一切正常。

我正在了解为什么会这样。如果能帮助理解这一点,那就太好了。

成员函数(方法)与常规函数有很大不同。他们需要知道他们调用了哪个对象(this 指针)。因此,要修复它,请将 MyLogging 设为全局函数或静态成员函数。

注意:C++11中还有mem_fn可以解决上面的问题,但是qInstallMessageHandler需要一个函数指针,mem_fn创建包装对象的时候。也许这会在以后的 Qt 版本中改变。