每个Qter都该知道的qDebug

简介: 每个Qter都该知道的qDebug

在项目的开发中,当我们调试程序时,最常用的就是打印信息了,Qt为我们提供了非常方便的打印信息类QDebug。


大家应该已经很熟练的使用QDebug了,但也许有些地方并没有注意到,下面小豆君就介绍一下QDebug的一些常用特性。


1 qDebug()的最常用法

我们可以使用qDebug像使用std::cout一样,直接在重定向操作符(<<)后面加上我们的字符串即可。

如:

qDebug() << "Hello" << 123;

qDebug()还可以打印Qt中的基本类型,例如QString,QByteArray,QDate,QRectF,QVariantHash,QFont等等,关于Qt中的基本类型,大家可以在帮助文档中搜索关键字QMetaType,这里就不列了。

如:

qDebug() << QString("Hello") << QPoint(10, 10);

以上的用法都必须包含头文件QDebug

#include <QDebug>


2 不包含头文件,直接使用qDebug()

一般的,每次我们使用qDebug()<<时,都会要求包含头文件QDebug。如果你是用习惯了C语言中的格式化输出,那么也可以像下面的做法来输出打印信息。

#include <QObject>
int main(int argc, char *argv[])
{
    int num = 20;
    char str[20]="hello world";
    qDebug("如果只写在括号里,是不需要QDebug头文件的 %d %s", num, str);
}


实际qDebug是包含在qlongging.h中的,因为我们的Qt程序,一般都会包含QObject,所以这里的头文件包含了QObject,从而我们就不必要额外的再添加QDebug头文件。


以上对于只打印字符串等一些临时性的基本类型信息时,使用这种方法是非常有效的,但是,要记住Qt所支持的基本类型是不可以打印的。


3 为自定义类添加qDebug()打印

如果我们想要使用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;
}

首先,自定义了一个类Student,编写了构造函数和获取姓名的获取器。

其次,定义了"<<"操作符,打印名字。

最后,在main函数中创建Student的实例,并用qDebug()打印该实例。


4 消除qDebug()打印

qDebug的打印信息,主要是为了方便调试程序时尽快找到bug,所以当我们在发布版本时,需要去掉debug打印,一方面可以加快我们程序的执行速度,另一方面可以减小我们程序的体积。


在我做的项目中有很多人是采用加注释的方法来去掉打印的,虽然这个方法可行,但不是很有效的,如果哪天程序出了bug还需要再把打印信息去掉注释,这是很麻烦的。当然,将日志分级也是个很不错的想法。


为了解决这个问题,你只需要在你的pro文件里加上一行预定义宏即可。

DEFINES += QT_NO_DEBUG_OUTPUT


在你的程序添加上这个宏,重新编译运行程序,看看你的打印信息是不是都不见了呢,哈哈,这是不是很方便啊,Qt就是这么的懂你。


关于qDebug的知识点小豆君就先讲到这里吧,熟练掌握以上的知识在我们的项目开发中基本上是够用了。有兴趣的同学,还可以查看qWarning() qCritical() qFatal()这些函数,大概够和qDebug()类似,这里我就不讲了。


关于Qt中的调试问题,随着我们以后深入的学习,小豆君还会介绍Qt的新断言机制,智能指针检测识别机制,Creator调试器用法等。

如果你想要获得更多干货,请关注我的微信公众号:小豆君,只要关注,便可加入小豆君为大家创建的C++\Qt交流群,方便讨论学习。

相关文章
|
编解码 Linux C语言
探索C++与Live555实现RTSP服务器的艺术(一)
探索C++与Live555实现RTSP服务器的艺术
1025 1
|
安全 数据处理 C++
【Qt 底层之事件驱动系统】深入理解 Qt 事件机制:主事件循环与工作线程的交互探究,包括 QML 的视角
【Qt 底层之事件驱动系统】深入理解 Qt 事件机制:主事件循环与工作线程的交互探究,包括 QML 的视角
3043 3
|
监控 算法 安全
【Qt 应用开发】Qt 中的信息输出机制:QDebug、QInfo、QWarning、QCritical 的简单介绍和用法
【Qt 应用开发】Qt 中的信息输出机制:QDebug、QInfo、QWarning、QCritical 的简单介绍和用法
1610 1
|
Ubuntu 安全 网络协议
|
存储 安全 编译器
【C++ 17 泛型容器对比】C++ 深度解析:std::any 与 std::variant 的细微差别
【C++ 17 泛型容器对比】C++ 深度解析:std::any 与 std::variant 的细微差别
853 1
|
Linux 图形学
深入理解Qt定时器:QTimer的魅力与挑战(一)
深入理解Qt定时器:QTimer的魅力与挑战
7296 0
|
Linux Shell 开发工具
C++ 的 ini 配置文件读写/注释库 inicpp 用法 [ header-file-only ]
这是一个C++库,名为inicpp,用于读写带有注释的INI配置文件,仅包含一个hpp头文件,无需编译,支持C++11及以上版本。该库提供简单的接口,使得操作INI文件变得容易。用户可通过`git clone`从GitHub或Gitee获取库,并通过包含`inicpp.hpp`来使用`inicpp::iniReader`类。示例代码展示了读取、写入配置项以及添加注释的功能,还提供了转换为字符串、双精度和整型的函数。项目遵循MIT许可证,示例代码可在Linux环境下编译运行。
1293 0
|
网络架构
蓝易云 - 关于香港服务器的三种线路讲解
在选择线路时,需要根据你的具体需求和预算进行权衡。如果你需要稳定、快速的连接,可能需要考虑使用CN2或BGP线路。如果你的预算有限,直连线路可能是一个合适的选择。
172 0
|
存储 SQL 缓存
MySQL 配置文件 my.cnf / my.ini 逐行详解
充分理解 MySQL 配置文件中各个变量的意义对我们有针对性的优化 MySQL 数据库性能有非常大的意义。我们需要根据不同的数据量级,不同的生产环境情况对 MySQL 配置文件进行优化。Windows 和 Linux 下的 MySQL 配置文件的名字和存放位置都是不同的,WIndows 下 MySQL 配置文件是 `my.ini` 存放在 MySQL 安装目录的根目录下;Linux 下 MySQL 配置文件是 `my.cnf` 存放在 `/etc/my.cnf`、`/etc/mysql/my.cnf`。我们也可以通过 `find` 命令进行查找。
36630 2