前言

在写代码的时候,难免会调试程序,确保某一个语句或运算结果符合预期,如果不是的话就将程序暂停,便于修改,那么这时候就要用到一个Qt 中的调试神器—Q_ASSERT(断言)。
所谓的断言,其实很简单,它是一个宏定义,接受一个布尔值,当判断的语句为真时,不做任何操作,如果判断的语句为假,那么在 debug 模式下程序运行到该地方会自动断下,并弹出一个系统消息框,并且在程序输出栏会打印出断言的位置,可以快捷的进入到该位置,便于进行修改。

正文

写一个很简单的调试程序来看一下:

Widget::Widget(QWidget *parent): QWidget(parent)
{QPushButton * btn = NULL;Q_ASSERT(btn);btn = new QPushButton(this);Q_ASSERT(btn);
}

这里显示定义一个 QPushButton 对象,并初始化为 NULL,然后添加断言,运行程序后自动弹出一个系统错误框:(我这里是用的 Mac 编译的)

并且程序输出日志也有相应的提示:

这就是 Q_ASSERT 的神奇之处,在调试 Qt 程序的时候非常方便。
来看看它的源码:

Q_CORE_EXPORT void qt_assert(const char *assertion, const char *file, int line);  #if !defined(Q_ASSERT)
#  ifndef QT_NO_DEBUG
#    define Q_ASSERT(cond) ((!(cond)) ? qt_assert(#cond,__FILE__,__LINE__) : qt_noop())
#  else
#    define Q_ASSERT(cond) qt_noop()
#  endif
#endif 

在QT_NO_DEBUG 模式下,也就是调试模式下程序会执行qt_assert(),在 Release 模式下执行qt_noop()函数,而 qt_noop()函数是一个内联空函数,什么都不做,定义如下:

inline void qt_noop(void) {}  

建议大家在程序中多使用断言来进行判断逻辑,有助于尽早的发现并解决程序中隐藏的错误点。

Qt 断言的使用 Q_ASSERT相关推荐

  1. Qt程序调试之Q_ASSERT断言

    在使用Qt开发大型软件时,难免要调试程序,以确保程序内的运算结果符合我们的预期.在不符合预期结果时,就直接将程序断下,以便我们修改. 这就用到了Qt中的调试断言 - Q_ASSERT. 用一个小例子来 ...

  2. QT实现可移动和改变尺寸的无边框窗口

    2019独角兽企业重金招聘Python工程师标准>>> 实现QT无边框窗口的拖动,尺寸改变.需要的时候从该类继承,派生类需要定义为QWidget. 头文件: #ifndef SIZE ...

  3. 【Qt】断言Q_ASSERT的使用

    半路出家,总是有太多东西需要学习,有太多问题需要解决. --[Y忍冬草] 最近在写完项目软件后,虽然对于测试出的问题都很好的解决,但是总纠结于发布后出现问题怎么办?就查看了一些关于断言和异常处理的方法 ...

  4. Qt文档阅读笔记-Q_ASSERT的另外一总用法(大佬用法)

    刚刚看到文档里面有个Q_ASSERT,好玩的用法! 普通人的用法如下: #include <QApplication> #include <QGraphicsLineItem> ...

  5. 【精华】掌握Qt调试技术

    前言 软件调试,是开发过程中必备的技能.通过调试可以发现软件存在的bug,即缺陷.调试可以帮助开发者窥探到软件运行过程中的详细状态,从而为消除bug提供重要信息.调试的英文是debug,前面的de在英 ...

  6. Qt - QTChart绘制图表

    文章目录 前言 准备工作 安装QChart组件 项目配置 主要组成部分 QChartView QChart 序列 坐标轴 图例 静态图表 动态图表 场景一 思路 效果 核心实现 场景二 思路 效果 核 ...

  7. Qt数据可视化(QBoxPlotSeries盒须图)

    目录 创建盒须图类 设置盒须图数据 计算中间值 源代码 widget.cpp 实现效果如下: QBoxPlotSeries类以方框和胡须图表的形式显示数据. "长方体绘图"系列充当 ...

  8. 代码工程/Qt 开发环境提升(2)

    文章目录 概述 编译问题 macro name is a reserved identifier 运行问题 单步调试-结构体局部变量 Qt 定位内存起始地址失败 查看U8*的变量 编辑问题 无法使用高 ...

  9. 11.QT事件机制源码时序分析(下)

    接上一篇文章https://blog.csdn.net/Master_Cui/article/details/109182406,本文继续解析QCoreApplication::sendEvent和Q ...

最新文章

  1. NSArray和NSMutableArray
  2. practical rendering and computation with dx11 ebook
  3. 突发:ORA-12541:TNS:无监听程序 的调查解决方法(监听日志已满导致)
  4. python 爬虫 博客园_Python爬虫爬取博客园作业
  5. 乘法口诀表编程php视频,PHP学习之制作乘法口诀表
  6. 【Python】PyCharm新建PythonPackage呈现出普通Dictionary的样式的解决方法
  7. 【bzoj2929】[Poi1999]洞穴攀行 网络流最大流
  8. lubridate | 日期类型数据的转换
  9. SpringBoot之日志记录 SLF4J(H)
  10. 编写bat脚本指定jdk路径运行jar包
  11. 互联网计算机技术方面的入门书籍有哪些推荐?
  12. 【TDA4系列】CCS 最新版本安装与教程地址
  13. 关联规则挖掘算法之Apriori算法
  14. Yandex安装插件实现百度网盘不需要会员就能倍速播放
  15. .mp4视频测试地址
  16. java开学考试感想及代码
  17. TableauBDP,哪个才是最适合中国用户的数据可视化分析工具?
  18. 关于ssm框架的外文文献及译文_学术小白应该如何高效阅读文献?
  19. el-upload 仅上传一张图片
  20. Win10 使用黑屏重置键 解决 黑屏问题

热门文章

  1. 2020年搜索推荐系统论文干货集锦
  2. MCtalk对话抱抱星英语:从Diss在线英语教学乱象到回归教育本原
  3. 我的随笔---高亮规范
  4. MariaDB配置慢日志
  5. Microsoft Exchange 2010 安装配置
  6. mysql online ddl
  7. 区分各浏览器的CSS hack(包括360、搜狗、opera)
  8. 关于Flex-Mvc的几个框架的简单介绍
  9. Server2012Web方式修改用户名密码
  10. 关于instancetype代替id的使用区别