如下的代码:
#include <QCoreApplication>
#include <QDebug>
#include <QByteArray>
#include <iostream>
#include <stdio.h>
#include <QDebug>
using namespace std;
int main(int argc, char *argv[])
{
cout << "The std cout output msg" << endl;
qDebug() << "The qDebug output msg";
qInfo() << "The qInfo output msg";
qWarning() << "The qWarning output msg";
qCritical() << "The qCritical output msg";
qFatal("The qFatal output msg");
return 0;
}
在Linux中程序有2个关键,一个是标准输出,一个是标准错误,在C语言中,有stderr和stdout。
程序运行截图如下:
如果把标准输出重定向到1.txt文件中:那么屏幕就只会输出stderr
然后把标准错误放到标准输出上这样屏幕就不会打印东西了:
所有的数据都将在1.txt中:
下面来说下这个的作用,本人在搞开发的时候,经常改别人的程序,或者在xx程序中进行二次开发,这样的话就有个问题,大量的打印。
当别人程序里面只有cout作为输出的时候,
自己可以使用qDebug()进行打印,然后把标准输出重定向,这样标准错误就会打印到屏幕上了。
下面问题来了,当那个项目里面又有人cout、qDebug这样改怎么搞,下面提供3个解决思路。
第一个,将qDebug改为stdout,自己使用qInfo或其他几个进行输出。然后就和上面一样了,代码如下:
#include <QCoreApplication>
#include <QDebug>
#include <QByteArray>
#include <iostream>
#include <stdio.h>
#include <QDebug>
using namespace std;
void messageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg){
QByteArray localMsg = msg.toLocal8Bit();
switch(type){
case QtDebugMsg:
fprintf(stdout, "qDebug: %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(messageOutput);
cout << "The std cout output msg" << endl;
qDebug() << "The qDebug output msg";
qInfo() << "The qInfo output msg";
qWarning() << "The qWarning output msg";
qCritical() << "The qCritical output msg";
qFatal("The qFatal output msg");
return 0;
}
程序运行截图如下:
这种方式是不是很有用
第二种就不演示了,就提一下。把QtDebugMsg中不提供打印,然后自己用其他几个输出。
第三个:记录到文件中,这里可以加个当前时间,这样就和日志一样了,比如自己用Warning记录到文件里面:
程序源码如下:
#include <QCoreApplication>
#include <QDebug>
#include <QByteArray>
#include <iostream>
#include <QDateTime>
#include <QTextStream>
#include <stdio.h>
#include <QDebug>
#include <QFile>
using namespace std;
void messageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg){
QByteArray localMsg = msg.toLocal8Bit();
switch(type){
case QtDebugMsg:
fprintf(stdout, "qDebug: %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:
{
QFile file("myOut.txt");
if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){
break;
}
QTextStream out(&file);
out << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss") <<localMsg << "\n";
file.close();
}
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(messageOutput);
cout << "The std cout output msg" << endl;
qDebug() << "The qDebug output msg";
qInfo() << "The qInfo output msg";
qWarning() << "The qWarning output msg";
qCritical() << "The qCritical output msg";
qFatal("The qFatal output msg");
return 0;
}
程序运行截图如下:
相应的文件:
是不是改别人代码的时候好调试多了。