欢迎转载,请注明出处:https://blog.csdn.net/qq_39453936?spm=1010.2135.3001.5343
原文链接: https://blog.csdn.net/qq_39453936/article/details/120675366
QtMsgType
QtMsgType | 等级 |
---|---|
qDebug() | 调试消息 |
qInfo() | 信息消息 |
qWarning() | 警告消息和可恢复的错误 |
qCritical() | 关键错误和系统错误 |
qFatal() | 致命错误 |
qInstallMessageHandler
函数说明:
QtMessageHandler qInstallMessageHandler(QtMessageHandler handler)
- 此函数在使用Qt消息处理程序之前已定义。返回一个指向前一个消息处理程序。
- 消息处理程序是一个函数,用于打印qDebug,qWarning,qCritical和qFatal的错误消息。Qt库(调试模块)包含成百上千的警告信息,打印时(通常是无效的函数参数)发生内部错误。Qt构建在release模式下还包含一些除了QT_NO_WARNING_OUTPUT和/或QT_NO_DEBUG_OUTPUT之外的警告已经设置在编译。如果你实现自己的消息处理程序,需要完全控制这些消息。
- 在X11或Windows下的调试器,缺省的消息处理程序向标准输出打印消息。如果这是一个致命的消息,应用程序立即中止。
- 只有一个消息处理程序可以被定义,因为这通常是在应用程序的基础上完成控制调试输出。
- 恢复消息处理程序,调用qInstallMessageHandler(0)。
- Windows中,如果是一个控制台应用程序,文本将被发送到控制台;否则,被发送到调试器。
自定义消息处理
#include <qapplication.h>
#include <stdio.h>
#include <stdlib.h>
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
QByteArray localMsg = msg.toLocal8Bit();
const char *file = context.file ? context.file : "";
const char *function = context.function ? context.function : "";
switch (type) {
case QtDebugMsg:
fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
break;
case QtInfoMsg:
fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
break;
case QtWarningMsg:
fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
break;
case QtCriticalMsg:
fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
break;
case QtFatalMsg:
fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
break;
}
}
int main(int argc, char **argv)
{
qInstallMessageHandler(myMessageOutput);
QApplication app(argc, argv);
// 打印信息
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();
}
同时输出到调试窗口
QtMessageHandler gDefaultHandler = NULL;
//在其它地方调用qInstallMessageHandler设置新的输出函数,但保存原来的函数
gDefaultHandler = qInstallMessageHandler(myMessageOutput);
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
...
if(gDefaultHandler)
{
gDefaultHandler(type,context,msg);
}
}
release 下打印消息信息
-
方法1:Release 版本默认不包含这些信息:文件名、函数名、行数,需要在项目文件加入以下代码,加入后最好重新构建项目使之生效:
DEFINES += QT_MESSAGELOGCONTEXT
-
方法2:
#undef QT_MESSAGELOG_FILE #undef QT_MESSAGELOG_LINE #undef QT_MESSAGELOG_FUNC #undef qDebug #undef qInfo #undef qWarning #undef qCritical #undef qFatal #define QT_MESSAGELOG_FILE __FILE__ #define QT_MESSAGELOG_LINE __LINE__ #define QT_MESSAGELOG_FUNC Q_FUNC_INFO #define qDebug QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).debug #define qInfo QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).info #define qWarning QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).warning #define qCritical QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).critical #define qFatal QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).fatal
参考文章https://blog.csdn.net/liang19890820/article/details/51838096
小白发文,欢迎指正