有时候我们QListWidet的时候刚开始加载了很多个item,但是可能到后面要清空所有的item,重新加载。
但是在调用QListWidget的clear的时候,无论调用什么方式总是会出现段错误。
//方法一:
ui->listWidget->clear();
// 结果:出现段错误
//方法二:
void deleteAllSlot()
{
int counter = ui->cityListWidget->count();
qDebug() << "count is " <<counter;
QListWidgetItem *item;
for(int index = 0;index <counter;index++)
{
item = ui->cityListWidget->takeItem(0);
if(item !=NULL)
delete item;
qDebug() << "index is " <<index;
}
// 结果:在删除最后一项的时候发生段错误
相信大部分人在使用QListWidget时都会遇到这种情况。这是因为在执行清空QListWidget前,应该是使用connect将,QListWidge的信号与某个槽函数链接在一起了。
//例如:
connect(ui->listWidget, SIGNAL(itemActivated(QListWidgetItem *)),
this, SLOT(activatedItem(QListWidgetItem *)));
connect(ui->listWidget, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),
this, SLOT(ChangedItem(QListWidgetItem*,QListWidgetItem*)));
当把QListWidget中的信号和某个槽函数链接在一起的时候,在清空QListWidge时就会发生段错误,所以我们在清空QListWidget之前应该把链接上的信号和槽解除链接,调用disconnect函数。在清空完QListWidge之后,我们在把相应的信号和槽链接起来,这样就不会出现段错误了,成功清空QListWidget
// 例如:
// 解除绑定
disconnect(ui->listWidget, SIGNAL(itemActivated(QListWidgetItem *)),
this, SLOT(activatedItem(QListWidgetItem *)));
disconnect(ui->listWidget, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),
this, SLOT(ChangedItem(QListWidgetItem*,QListWidgetItem*)));
ui->listWidget->clear() ;//执行清空操作
// 重新绑定信号和槽
connect(ui->listWidget, SIGNAL(itemActivated(QListWidgetItem *)),
this, SLOT(activatedItem(QListWidgetItem *)));
connect(ui->listWidget, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),
this, SLOT(ChangedItem(QListWidgetItem*,QListWidgetItem*)));
以下为个人体会
三步走的方法:
1.先断开与这个控件的信号与槽连接(先disconnect);
2.ui->listWidget->clear();
3.添加数据,连接信号与槽(connect)(这一步的添加数据和connect顺序可以互换)
一句话:先diconnect,再调用QListWidget的clear(),才能保证不出现段错误的问题。
原文链接:https://blog.youkuaiyun.com/yaowangII/article/details/80929261