QDebug 输出调试信息

在程序开发过程中,我们经常需要打印一些调试信息到终端,以供我们开发人员快速定位软件的问题所在。而QDebug类就是用来完成这样的功能的一个类。使用QDebug类,我们可以将调试信息打印到控制台、文件、甚至某个字符串中。其构造函数如下:

QDebug(QIODevice *device)
QDebug(QString *string)
QDebug(QtMsgType type)
QDebug(const QDebug &other)

不过,通常情况下,我们并不直接创建这个类的对象来输出调试信息。因为,Qt中,为我们提供了相应的便捷函数,如qDebug(),改函数会为我们自动创建一个默认的QDebug对象。如下代码所示:

      qDebug() << "Date:" << QDate::currentDate();
      qDebug() << "Types:" << QString("String") << QChar('x') << QRect(0, 10, 50, 40);
      qDebug() << "Custom coordinate type:" << coordinate;

其中,qDebug() 使用接收QtMsgType类型值得构造函数还创建一个QDebug() 对象。类似的,Qt还为我们提供了qWarning()、qCritical()、qFatal()、qInfo() 函数,根据不同的消息类型创建出不同的QDebug对象。QtMsgType的详细声明如下:

ConstantValueDescription
QtDebugMsg0A  message generated by the qDebug() function
QtWarningMsg1A  message generated by the qWarning() function
QtCriticalMsg2A  message generated by the qCritial() function
QtFatalMsg3A  message generated by the qFatal() function
QtInfoMsg4A  message generated by the qInfo() function
QtSystemMsgQtCrtitialMsg 


QDebug会自动格式化其输出,以使输出更可读。它会自动地在参数中间添加空格,并在输出QString、QByteArray、QChar参数时,自动为这些内容添加双引号。当然,我们也可改变这些默认选项,通过使用相关的成员函数,比如space()、nospace()、quote()、noquote()。而且,文本流中常用的格式符也可以在QDebug中使用。

QDebug中已经针对很多数据类型为我们重载了<< 运算符,能满足我们一般的调试需求。若实在想添加对自己的某种自定义类型的支持,也可以自己再重载<< 即可。如下面的例子所示:

struct Student
{
      QString name;
      QString sex;
};  
QDebug operator<<(QDebug debug, const Student &s)
{
      QDebugStateSaver saver(debug);
      debug.nospace() << '[' << s.name << ", " << s.sex << ']';

      return debug;
}

其中,用到了QDebugStateSaver类。该类其实就是在自定义QDebug运算符时,先保存QDebug当当前设置,然后我们可以根据自动的需要修改相关设置,进而输入我们需要的格式信息;当saver对象,超出作用域进行析构时,会自动恢复QDebug的状态。

至于QDebug的成员函数,我目前主要是使用noquote() 函数。上面我们说过,QDebug在输出QString 和 QByteArray等类型的内容时,会自动为它们添加双引号。而有时,在反而会让控制台的信息更密集,不便于快速分析结果。所以,我经常使用该函数,修改此默认设置。如下代码所示:

#include <QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString s = "hello";
    qDebug() << s;
    qDebug().noquote() << s;

    return a.exec();
}

其输出结果如下:






版权声明:本文为Amnes1a原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。