在使用QAbstractListModel创建model的时候,其他使用的时候都正常,但是只要我一使用 beginResetModel();和endResetModel();更新整个model的数据的时候,程序就会奔溃。
先看代码:
qml中,通过index从model中获取isOnline的值
isOnline:$avIntercomModel.getIsOnline(index)
cpp中,从保存的数据当中,根据index返回数据:
bool AvIntercomModel::getIsOnline(int index)
{
if(index >= m_userInfoList.count())
{
return false;
}
else
{
m_mutex.lock();
bool tmp = m_userInfoList.at(index).m_isOnline;
m_mutex.unlock();
return tmp;
}
}
经过排查,发现是当使用beginResetModel();和endResetModel();更新的时候,model有数据被删除的时候,被删除的model的index将会被改为-1,且还是会对数据进行赋值,也就是上面的isOnline:$avIntercomModel.getIsOnline(index)操作,而getIsOnline中对于index小于0的情况没有判断,导致获取到了m_userInfoList.at(-1),导致程序奔溃。
经修改:
bool AvIntercomModel::getIsOnline(int index)
{
if(index >= m_userInfoList.count() || index < 0)
{
return false;
}
else
{
m_mutex.lock();
bool tmp = m_userInfoList.at(index).m_isOnline;
m_mutex.unlock();
return tmp;
}
}