活生生的例子:qInstallMessageHandler接受指定类型的函数指针,这样就可以随心所欲的让程序员自定义函数名以及函数位置

时间:2023-03-09 20:48:54
活生生的例子:qInstallMessageHandler接受指定类型的函数指针,这样就可以随心所欲的让程序员自定义函数名以及函数位置

理论:qInstallMessageHandler是被定义在全局空间里:

http://doc.qt.io/qt-5/qtglobal.html#QtMessageHandler-typedef

实践:

http://blog.****.net/liang19890820/article/details/51838379

void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
// 加锁
static QMutex mutex;
mutex.lock(); QByteArray localMsg = msg.toLocal8Bit(); QString strMsg("");
switch(type)
{
case QtDebugMsg:
strMsg = QString("Debug:");
break;
case QtWarningMsg:
strMsg = QString("Warning:");
break;
case QtCriticalMsg:
strMsg = QString("Critical:");
break;
case QtFatalMsg:
strMsg = QString("Fatal:");
break;
} // 设置输出信息格式
QString strDateTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");
QString strMessage = QString("Message:%1 File:%2 Line:%3 Function:%4 DateTime:%5")
.arg(localMsg.constData()).arg(context.file).arg(context.line).arg(context.function).arg(strDateTime); // 输出信息至文件中(读写、追加形式)
QFile file("log.txt");
file.open(QIODevice::ReadWrite | QIODevice::Append);
QTextStream stream(&file);
stream << strMessage << "\r\n";
file.flush();
file.close(); // 解锁
mutex.unlock();
} int main(int argc, char **argv)
{
QApplication app(argc, argv); // 安装消息处理程序
qInstallMessageHandler(myMessageOutput); // 打印信息
qDebug("This is a debug message.");
qWarning("This is a warning message.");
qCritical("This is a critical message.");
qFatal("This is a fatal message."); ...
return app.exec();
}

所以我可以自定义myMessageOutput函数,函数明明是随意指定的,却仍可以在整个QT框架中正确工作,靠的就是函数指针这个办法。

以前就光知道这套理论,却不知道什么情况下应该应用它,现在算是明白了。而且这应该也是QT框架中常用的一种手法,比如还有QtFutur里要用到。