ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

调试方式

2020-03-12 14:42:27  阅读:262  来源: 互联网

标签:cout 方式 ASSERT QString 读入 qDebug include 调试


说明

  • 嵌入式开发未使用QTCreate,因此暂未研究QTCreate工具的使用。

打印信息

  • Qt平台采用C++语言,因此支持多种方式打印信息。
  1. C语言printf函数。
  2. C++语言std::cout。
  3. Qt平台日志功能(qDebug、qWarnng、qCritical、qFatal)。
  • 方式区别
  1. 方式3是QT平台实现的打印方式,对QT平台兼容性好,std::cout 大部分情况下可以正常使用,但是有些情况下会出现兼容性问题,例如:
#include <QApplication>

using namespace std;
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    
    cout << "test" << endl;
    return a.exec();
}
* 以上代码不能正常输出,原因是和QTextStream的cout、cin冲突了,不能使用using namespace std,去掉后 改为std::cout就行了。
* 新版本QT这些问题可能已解决,但是不是官方方式,兼容性问题不可避免的。
  1. 方式3原生支持QT平台的基本数据类型,例如QString,QByteArray,QDate,QRectF,QVariantHash,QFont等等,其它方式需要特殊处理。
  2. 方式3是在std::cout基础上实现的,性能比较差,网上有很多三种方式的性能对比,性能表现:printf > std::cout > qDebug,
    qDebug相对于std::cout和printf差距过大(6~10倍)。

Qt平台日志功能

日志等级分类

  • qDebug : 调试信息提示
  • qWarning: 一般的警告提示
  • qCritical: 严重错误提示
  • qFatal: 致命错误提示

将日志信息转存到文件

  • Qt提供了qInstallMsgHandler 方法用来定制消息发生后如何来处理。
  • qInstallMsgHandler 是一个回调函数,由qDebug、qWarnng、qCritical、qFatal这些函数进行触发,这样就允许用户自己来处理这些消息文本,例如:将这些消息文本输出并保存到相关的日志文件中。
  • 例子:
#include <qapplication.h>
#include <stdio.h>
#include <stdlib.h>

void customMessageHandler(QtMsgType type, const char *msg)
{
    QString txtMessage;
  
    switch (type) 
    {    
        case QtDebugMsg:    //调试信息提示
            txtMessage = QString("Debug: %1").arg(msg);
            break;

        case QtWarningMsg:    //一般的warning提示
            txtMessage = QString("Warning: %1").arg(msg);
            break;

        case QtCriticalMsg:    //严重错误提示
            txtMessage = QString("Critical: %1").arg(msg);
            break;

        case QtFatalMsg:    //致命错误提示
            txtMessage = QString("Fatal: %1").arg(msg);
            abort();
    }

    //保存输出相关信息到指定文件
    QFile outputFile("customMessageLog.txt");
    outputFile.open(QIODevice::WriteOnly | QIODevice::Append);
    QTextStream textStream(&outputFile);
    textStream << txtMessage << endl;
}

int main( int argc, char * argv[] )   
{
    QApplication app( argc, argv );

    qInstallMsgHandler(customMessageHandler); //注册MsgHandler回调函数

    //以后就可以像下面这样直接打日志到文件中,而且日志也会包含时间信息
    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();
}
  • 取消信息处理,直接调用qInstallMsgHandler(0)就可以。

qDebug 使用

  • qWarning,qCritical,qFatal 类似。

基本使用

  • 头文件
#include <QDebug>
  1. c++ 数据流式
QString str("123");

qDebug() << str << endl;
  1. c 函数式
int year=18;
qDebug("My age is %d",year);

%a,%A 读入一个浮点值(仅C99有效)  
%c 读入一个字符   
%d 读入十进制整数  
%i 读入十进制,八进制,十六进制整数  
%o 读入八进制整数   
%x,%X 读入十六进制整数   
%s 读入一个字符串,遇空格、制表符或换行符结束。   
%f,%F,%e,%E,%g,%G 用来输入实数,可以用小数形式或指数形式输入。   
%p 读入一个指针   
%u 读入一个无符号十进制整数   
%n 至此已读入值的等价字符数   
%[] 扫描字符集合   
%% 读%符号

为自定义类型添加qDebug支持

  • 例子:
#include <QDebug>
class Student
{
public:
    Student(const QString& nm){name = nm;}
    QString getName() const{return name;}
private:
    QString name;
};
QDebug operator<<(QDebug debug, const Student &c)
{
    debug << c.getName();
    return debug;
}
int main(int argc, char *argv[])
{
    Student student("John");
    qDebug() << student;
}

关闭qDebug打印

  • 一键关闭所有打印,只需要在pro文件里加上一行预定义宏。
DEFINES += QT_NO_DEBUG_OUTPUT
  • 缺陷:qDebug 只能关闭所有,不能按模块关闭,不方便进行单元测试。

断言

  • QT中的断言和C或C++的类似。
  • Qt中提供了两个断言的宏Q_ASSERT()和Q_ASSERT_X()。
  • 定义
1. Q_ASSERT(bool)
2. Q_ASSERT_X(bool, device, log)  
  • 原理:断言判断bool值,为假的时候通过 qFatal() 函数输出错误信息。
  • 区别:Q_ASSERT_X 可以自定义log信息和设备信息; Q_ASSERT则打印Qt自带的log信息
  • 开启/关闭:默认开启,关闭需要定义宏QT_NO_DEBUG

标签:cout,方式,ASSERT,QString,读入,qDebug,include,调试
来源: https://blog.csdn.net/qazw9600/article/details/104818091

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有