Qt常见不合理写法导致崩溃

  1. 事件循环

QApplication::processEvents(QEventLoop::ExcludeUserInputEvents)在处理事件时排除用户输入事件。然而,这并不意味着它会完全阻止所有与用户输入相关的事件。有些事件可能间接地由用户输入触发,或者可能与你尝试实现的逻辑产生冲突。
使用QEventLoop的事件循环能使UI界面正常响应,不会出现卡住的现象。但是QEventLoop 美中不足的地方是在调用exec()的时候,没办法过滤掉用户的输入事件,往往导致槽函数重入。
如果调用改代码进行死循环或高频次调用,可能会系统崩溃

  1. QString的使用
  • 使用memset不能对QString清空,可致QString对象状态不正确,进而导致程序出现未定义的行为;要清空QString,应该使用其提供的成员函数,如clear()
  • 多线程中QString尽量减少使用,尽量使用基础类型。这是由于qt5的隐式共享机制(写时复制)在多线程情况下不安全导致的。隐式共享机制,即使指针共享。QString、QImage、QVariant等等也都有此问题,该问题qt5存在,qt6官方修复。
  1. 子线程绘制UI导致崩溃

Qt不能在子函数中直接绘制UI,因为子线程直接绘制UI会崩溃,所以需要信号函数将子、主线程连接起来。

  1. 析构函数中崩溃

析构函数崩溃的原因可能有很多,但通常是由于在析构函数中访问了已经被删除或释放的对象指针或内存区域引起的。可能是由于以下原因导致析构函数崩溃:

  • 对象被重复删除:如果您在程序中多次删除同一个对象,可能会导致析构函数崩溃。确保您只在需要时删除对象,并且只删除一次。
  • 对象指针为空:如果您在析构函数中访问一个空指针,程序就会崩溃。确保在访问对象指针之前,该指针已经被正确初始化。
  • 内存泄漏:如果您的程序中存在内存泄漏,可能会导致析构函数崩溃。确保您在程序中正确管理内存,并在不需要时释放对象。
  1. 控件地址越界

在事件循环中,有部分控件访问的地址越界
例如,当自定义的分配的那一块图像缓冲区被释放时,Qt程序因为label上的图片数据指针被释放,指向了无效数据空间。该控件可能有权限访问也可能没有,就会导致随即崩溃。体现在代码上就是主程序事件循环上崩溃。

  1. 表格的item如果是空的调用text()等会崩溃

下面这个秒崩。
QTableWidget->item(row,col)->text;
但是下面的不会,但写这个没什么意义
QTableWidget->item(row,col);
解决方案:是空则不执行调用item的语句即可
if(QTableWidget->item(row, col)==nullptr)

  1. 二次setCellWidget后调用老部件会闪退

表格->setCellWidget(Row, Column,部件1);
表格->setCellWidget(Row, Column,nullptr);
调用部件1,立即闪退,其实这个很容易理解。
帮助文档中setCellWidget的解释是再次调用时,会删除老部件,所以老部件成了野指针,自然就无法调用。
解决方案:

  • setCellWidget后不进行第二次部件替换,可以通过setVisible将其隐藏/显现;
  • 第二次setCellWidget重新插入回来,然后就没影响了。
  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值