QT编程段错误和死循环的总结

从19年10月份开始学习QT编程已经快2个多月了,有了MFC编程的基础,上手QT相当容易。
然而,在QT编程中,遇到了两种很难定位问题的错误:段错误和死循环。
在普通C++编程中,如果遇到段错误,我们用gdb可以调试定位错误位置,因为一切代码都是我们写的。但QT是一个框架,我们只是编写了业务代码,QT还会为我们设计的UI编写很多代码,另外,我们使用了很多现成的QT类,很可能发生段错误位置是在QT自带的类里,所以,错误很难定位到。
在普通C++编程中,如果遇到了死循环,只需要查看自己写的循环的条件。但QT是界面编程,有信号槽机制,其实就是消息响应机制,另外,QT中还有一些方法会调用另一些方法,当你不清楚的时候就会引起死循环,比如A方法调用了B方法,如果你覆盖B方法的时候在B方法里调用A方法,那么就引起死循环了。
首先我们来说段错误,我遇到过的段错误有如下情况:
1、调用qgraphicsitem_cast<>()强转变量时,同static_cast<>()对比,要多一个类的Type()必须相同的要求,所以:如果转换的对象的Type同<>中填写的类的Type()不同,会返回NULL,如果不检查返回值,就会导致段错误。
2、QVector、QList等数组类,在removeOne的时候,因为传入的是一个对象,这个对象必须同数组中某个元素用“==”判断为真才会删除成功,这就要求在移除前不能修改,而且你可能要自己实现一个“==”才可以。
3、对于new一个对象然后将此对象添加到场景或widget等,往往需要手动删除此对象,但如果创建这个对象时,传递了parent指针(比如QGraphicsItem的所有子图形都会声明自己的父级指针),那么只需要确保父级对象被正确的delete即可,子对象会在父级对象被删除时一并删除。这个我没试过如果手动删除子对象,会不会引起段错误。
死循环则更麻烦,因为你往往都无法通过调试模式看到大概位置。有如下2种情况要注意:
1、update()会触发图形的paint调用,所以在paint里你肯定不能再使用update通知对象进行paint了。同时要注意,你也不能通知图形所在的场景update(),否则场景的update也会触发所有图形的update()。
2、QGraphicsView设置背景图的时候,我们通过覆盖drawBackground方法完成,但设置背景色则是通过调用setBackgroundBrush完成,而setBackgroundBrush会调用drawBackground方法,所以在drawBackground里一定更不能再调用setBackgroundBrush方法了。
界面编程有一套事件触发和处理机制,一定要很熟悉这些机制,否则,我们在编程时就会造成效率低下的问题。比如在同一个场景里如果QGraphicsItem太多了,就会造成卡顿,因为每一个QGraphicsItem对象都会调用paint,哪怕你的鼠标移动一下,也会导致所有对象调用paint重新绘制。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值