Qt 难找的意料之外原因、崩溃原因及错误原因(持续更新) 您所在的位置:网站首页 mtbd崩溃 Qt 难找的意料之外原因、崩溃原因及错误原因(持续更新)

Qt 难找的意料之外原因、崩溃原因及错误原因(持续更新)

2023-12-19 14:29| 来源: 网络整理| 查看: 265

这是一些容易令人没想到的崩溃或错误原因 序言意料之外原因removeWidget只是移除并没有删除该widget写容器之类的明明语法对,看着例子也对,偏偏就是写error: no matching member function for call to ???QPainterPath的isEmpty有坑,有MoveTo数据也是空 崩溃原因双重容器的find如果找不到需要寻找的key值就直接调用会崩溃表格的item如果是空的调用text()等会崩溃表格的setCellWidget的小部件,二次setCellWidget后调用老部件会闪退表格的QAbstractTableModel模型继承重写后,data漏写返回值后崩溃ModbusRTU模式,正常调用Qt的QModbusRtuSerialMaster库时崩溃叉掉窗口立即崩溃main函数里运行第一条函数方法前就崩溃Expression: invalid comparatorMicrosoft C++ 异常: std::bad_alloc,位于内存位置std::shared_ptr调用某函数的虚函数崩溃(这是一条完全摸不着头脑的崩溃,看看即可,平时碰不上) 错误原因——VS2019 QT5.12 MSVC2017找不到源文件ShaderEffectSource: 'recursive' must be set to true when rendering recursively.error: /EHa: No such file or directoryimplicit instantiation of undefined template QList...C2665: "qHash": ??个重载中没有一个可以转换所有参数类型the following files have no write permissionsc1083: 无法打开包括文件:" ui_XXX .h": No such file or directory待续

序言

这是一些我自己摔惨了,付出了大量时间才筛选发现的原因,其相对应的解决方案可能莫名其妙,但是对于碰到的人来说可能是刚刚好

意料之外原因 removeWidget只是移除并没有删除该widget

用QStackedWidget时,每次删除其子窗口时,用到了对象名,新的子窗口设置同对象名,结果其控件被接到了被removeWidget的窗口里。

void QStackedWidget::removeWidget(QWidget *widget) //保险删除方式 QWidget *widget = ui->stackedWidget->widget(0); ui->stackedWidget->removeWidget(ui->stackedWidget->widget(0)); delete widget;

注:QTableWidget里的cellWidget就是更改了,QTableWidget会自行删掉释放的。 其文档虽然写了,但是一般没人仔细看每一点。 .

写容器之类的明明语法对,看着例子也对,偏偏就是写error: no matching member function for call to ???

实际你写的这个函数有个const,所以当修改成员变量时就出了问题,因为这个容器没有这个const后缀的成员函数。 解决:要么绕开,要么通过const_cast< MyClass * >(ptr)强行控制,但后者不建议 .

QPainterPath的isEmpty有坑,有MoveTo数据也是空

如果在这条路径中没有元素,或者唯一元素是MoveToElement,则返回true;否则返回false。 解决:可以采用path = QPainterPath();和if (path.elementCount() != 0)进行相应的清空和判断。 注:其文档虽然写了,但是一般没人仔细看每一点。 .

崩溃原因 双重容器的find如果找不到需要寻找的key值就直接调用会崩溃 QMap testMap; QMapsetCellWidget(Row,Column,部件1); 表格->setCellWidget(Row,Column,nullptr); 调用部件1,立即闪退,其实这个很容易理解。

帮助文档中setCellWidget的解释是再次调用时,会删除老部件,所以老部件成了野指针,自然就无法调用。

.cpp QMap table_ProgressBar; table_ProgressBar.insert(row,new QProgressBar); table_ProgressBar.insert(row+1,new QProgressBar); ui->tableWidget->setCellWidget(row,column,table_ProgressBar[row]); ui->tableWidget->setCellWidget(row,column,nullptr); //另一个函数调用 qDebug()setCellWidget(row,column,table_ProgressBar[row]); ui->tableWidget->setCellWidget(row,column,nullptr); table_ProgressBar.insert(row,new QProgressBar); //另一个函数调用 qDebug() case Qt::DisplayRole: { if (index.column() data.append((i % 200)); }

看出什么问题没?uint8_t限制了最大也只有255,255+1=0,所以i永远也到达不了5000的限制,所以data容器重复申请内存直至没有空间申请为止。

改为uint32_t、uint16_t或者int之类的最大值大于限定值即可。 .

std::shared_ptr调用某函数的虚函数崩溃(这是一条完全摸不着头脑的崩溃,看看即可,平时碰不上)

环境:Qt5.14.2+MSVC2017 64bit(VS2019) CONFIG += c++14

class AA { public: AA(){qDebug() qDebug() int i=0; int j=10/i; }QT_CATCH(...){ qDebug()


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有