概念
在我们使用软件时大多使用release版本,这样在使用过程中的调试信息就不会显示出来,为了将调试信息打印在界面上或者放在文件中保存起来我们就可以使用重定向的技术。
在QT的帮助文档:qInstallMessageHandler中我们可以看到重定向的简单例子。
参考链接(https://www.cnblogs.com/wyuzm/p/9580447.html):
qInstallMessageHandler(调试详细日志文件输出):
此函数在使用Qt消息处理程序之前已定义。返回一个指向前一个消息处理程序。
- 消息处理程序是一个函数,用于打印qDebug,qWarning,qCritical和qFatal的错误消息。Qt库(调试模块)包含成百上千的警告信息,打印时(通常是无效的函数参数)发生内部错误。Qt构建在release模式下还包含一些除了QT_NO_WARNING_OUTPUT和/或QT_NO_DEBUG_OUTPUT之外的警告已经设置在编译。如果你实现自己的消息处理程序,需要完全控制这些消息。
- 在X11或Windows下的调试器,缺省的消息处理程序向标准输出打印消息。如果这是一个致命的消息,应用程序立即中止。
- 只有一个消息处理程序可以被定义,因为这通常是在应用程序的基础上完成控制调试输出。
- 恢复消息处理程序,调用qInstallMessageHandler(0)。
调试级别:
- qDebug: 调试信息
- qWarning:警告信息
- qCritical: 严重错误
- qFatal: 致命错误(解释器报错这个尽量不要重定向)
目的:生成log.txt日志文件,记录详细日志信息(包括等级、所在文件、所在行号、描述信息、产生时间等),以便于快速跟踪、定位。
注意:
QtFatalMsg如果添加abort();会提示abort已被调用,如果不添加Qt会弹出Debug错误。分析原因,这个消息本身是致命错误,重定向只是显示一下这个错误,发出这个消息后系统会认为代码发生了致命错误让软件停止运行。
代码示例
#include <qapplication.h>
#include <stdio.h>
#include <stdlib.h>
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
QByteArray localMsg = msg.toLocal8Bit();
switch (type) {
case QtDebugMsg:
fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
break;
case QtInfoMsg:
fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
break;
case QtWarningMsg:
fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
break;
case QtCriticalMsg:
fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
break;
case QtFatalMsg:
fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
abort();
}
}
int main(int argc, char **argv)
{
qInstallMessageHandler(myMessageOutput);
QApplication app(argc, argv);
...
return app.exec();
}
下面是将调试信息重定向到界面的示例:
void myMessageOutput::OutPutMessage(QtMsgType type, const QMessageLogContext &context,
const QString &msg)
{
QByteArray localMsg = msg.toLocal8Bit();
QDateTime time = QDateTime::currentDateTime();
QString strTime = time.toString("hh:mm:ss ");
QString text;
QString htmlText;
switch (type) {
case QtDebugMsg:
text = QString::fromLocal8Bit("%1 D: %2 \n").arg(strTime).arg(QString::fromLocal8Bit(
localMsg.constData()));
htmlText = formatHtml(text, "green");
break;
case QtInfoMsg:
text = QString::fromLocal8Bit("%1 I: %2 \n").arg(strTime).arg(QString::fromLocal8Bit(
localMsg.constData()));
htmlText = formatHtml(text, "green");
break;
case QtWarningMsg:
text = QString::fromLocal8Bit("%1 W: %2 \n").arg(strTime).arg(QString::fromLocal8Bit(
localMsg.constData()));
htmlText = formatHtml(text, "rgb(255, 170, 0)");
break;
case QtCriticalMsg:
text = QString::fromLocal8Bit("%1 C: %2 \n").arg(strTime).arg(QString::fromLocal8Bit(
localMsg.constData()));
htmlText = formatHtml(text, "red");
break;
case QtFatalMsg:
text = QString::fromLocal8Bit("%1 F: %2 \n").arg(strTime).arg(QString::fromLocal8Bit(
localMsg.constData()));
htmlText = formatHtml(text, "red");
break;
default:
text = QString::fromLocal8Bit("Time: %1 Default: %2 (%3:%4, %5)\n").arg(strTime).arg(
QString::fromLocal8Bit(localMsg.constData())).arg(context.file).arg(context.line).arg(
context.function);
htmlText = formatHtml(text, "black");
}
gOutStream << QDateTime::currentDateTime().toString("[yyyy-MM-dd hh.mm.ss]\t") + text;
gOutStream .flush();
ui->log_tbrowser->append(htmlText);
ui->log_tbrowser->moveCursor(QTextCursor::End);
}
const QString myMessageOutput::formatHtml(const QString &qText, QString color)
{
return QString("<font style='font-size:36px; background-color:white; color:%2;'> %1 </font><br/>").arg(
qText).arg(color);
}
文件重定向:
参考链接:Qt君
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)