这是一些容易令人没想到的崩溃或错误原因
序言
这是一些我自己摔惨了,付出了大量时间才筛选发现的原因
意料之外原因
removeWidget只是移除并没有删除该widget
用QStackedWidget时,每次删除其子窗口时,用到了对象名,新的子窗口设置同对象名,结果其控件被接到了被removeWidget的窗口里。
void QStackedWidget::removeWidget(QWidget *widget)
//保险删除方式
QWidget *widget = ui->stackedWidget->widget(0);
ui->stackedWidget->removeWidget(ui->stackedWidget->widget(0));
delete widget;
崩溃原因
双重容器的find如果找不到需要寻找的key值就直接调用会崩溃
QMap<int , int> testMap;
QMap<int , QMap<int , int > doubleMap;
testMap.insert(3,3);
doubleMap.insert(1,testMap);
doubleMap.insert(2,testMap);
qDebug()<<doubleMap.find(3).value;
最后一行秒崩,原因是因为找不到,所以返回了是个野指针,调用了野指针的后果你明白的。
解决方案:
qDebug()<<doubleMap[3];
用[ ]代替find( ).value即可,但这会没有对应key就自行添加,也可以直接判断find后的值是否正常能使用。
.
表格的item如果是空的调用text()等会崩溃
QTableWidget->item(row,col)->text();
上面这个秒崩,但是下面的不会,但写这个没什么意义。
QTableWidget->item(row,col);
自己一般设好值是不会的,但是如果在存在完全没设值的行使用序号排序会出现item为空指针的情况,因为空行被排序拉了上来,默认序号能排序
解决方案:
在前面加个判断
if(QTableWidget->item(row,col) == nullptr)
是空则不执行调用item的语句即可。
.
表格的setCellWidget的小部件,二次setCellWidget后调用老部件会闪退
表格->setCellWidget(Row,Column,部件1);
表格->setCellWidget(Row,Column,nullptr);
调用部件1,立即闪退,其实这个很容易理解。
帮助文档中setCellWidget的解释是再次调用时,会删除老部件,所以老部件成了野指针,自然就无法调用。
.cpp
QMap<int ,QProgressBar *> 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()<<table_ProgressBar; //立即闪退
可以看到,这个QProgressBar是处于QMap中的其中一个键值对,如果单纯通过setCellWidget删掉了这个QProgressBar,那么这个键值对的值会成野指针。
对于这个QMap的调用,只要会调用到row为键的值,就会闪退。
解决方案:
①、setCellWidget后不进行第二次部件置换,可以通过setVisible将其隐藏/显现;
②、第二次setCellWidget重新插入回来,然后就没影响了。
ui->tableWidget->setCellWidget(row,column,table_ProgressBar[row]);
ui->tableWidget->setCellWidget(row,column,nullptr);
table_ProgressBar.insert(row,new QProgressBar);
//另一个函数调用
qDebug()<<table_ProgressBar; //正常打印
.
ModbusRTU模式,正常调用Qt的QModbusRtuSerialMaster库时崩溃
崩溃显示:
ASSERT failure in processQueue: "send timer active", file qmodbusrtuserialmaster_p.h, line 301
或者
ASSERT failure in processQueue: "response timer active ", file qmodbusrtuserialmaster_p.h, line 302
或者
ASSERT failure in processQueue: "unexpected state: ", file qmodbusrtuserialmaster_p.h, line 377
崩溃原因不明,BUG源于QModbusRtuSerialMaster这个类,但是Qt官方5.13修复了这个BUG。
所以从Qt5.8——Qt5.12都会存在这个BUG,可选的话升级版本即可。
如果不升的话,看运气,可能崩溃也可能不会崩,暂时没找到解决办法。
.
叉掉窗口立即崩溃
MainWindow w;
w.setAttribute(Qt::WA_DeleteOnClose);
w.show(); //叉掉会崩,因为在栈上的delete &w;会崩
MainWindow *w = new MainWindow();
w.setAttribute(Qt::WA_DeleteOnClose);
w.show(); //叉掉会自行删除
.
错误原因——VS2019 QT5.12 MSVC2017
找不到源文件
原本可以打开的项目文件现在竟然关于qt的都打不开,提示找不到源文件,比如:
#include <qdebug.h>
在下方的提醒路径仔细看看!会发现这个路径和当前路径有些差别,这是因为我们因为某些原因改了路径或者其中一个路径名字,导致这个项目记录源文件路径的是记录以前的路径,和现在的路径不对。
.
ShaderEffectSource: ‘recursive’ must be set to true when rendering recursively.
此错误解决方法查自于:半夏微凉半夏殇
.
error: /EHa: No such file or directory
今天又让我逮到一个恶心我又死活查不到为什么的错误,是使用Qt的异常处理时配置出现的。
//配置方法:
pro
win* {
QMAKE_CXXFLAGS_EXCEPTIONS_ON = /EHa
QMAKE_CXXFLAGS_STL_ON = /EHa
}
CONFIG += exceptions
使用:
QT_TRY {
int i=0;
int j=10/i;
}QT_CATCH(...){
qDebug() << "Error";
}
原因很简单,就是MinGW不支持,要用MSVC编译运行才行。
implicit instantiation of undefined template QList…
implicit instantiation of undefined template Q容器名啥的
其实就是少了对应头文件,加上就行,比如
#include <QMap> //加上就行
implicit instantiation of undefined template QMap< int, QString > map;
.
待续
暂时只碰到这三个容易忽略的崩溃原因,其他碰到了再添加上