QTableView同时删除选中的多行,对于新手来说是一个容易出现错误的地方。
下面是一段错误的代码:
QModelIndexList indexList = tableview->selectionModel()->selectedIndexes();
QModelIndex index;
foreach(index,indexList)
{
view_model->removeRow(index.row());
}
错误现象:如果此tableview有多行多列,执行完后会发现删除的结果不同于我们预想。
错误分析:假设是一个五行四列的tableview,而你选中了第二和第四整行,你会发现indexList其实有八个元素(一个格子一个元素,而不是一行一个元素),执行removeRow操作实际上是重复删除某一行,而且第一次执行removeRow后view_model会发生变化,所以第一次执行后的再次执行都是错误的。
正确代码:
this->setSelectionBehavior(QAbstractItemView::SelectRows); //选择整行
//基于自写的派生于QTableView的TableView
void TableView::deleteItem()
{
QModelIndexList indexList1 = this->selectionModel()->selectedIndexes();
while (!indexList1.isEmpty())
{
QModelIndexList indexList = deleteRepeatList(indexList1);
QModelIndex index = indexList.first();
model->removeRow(index.row());
indexList1 = this->selectionModel()->selectedIndexes();
}
}
其中deleteRepeatList函数代码:
QModelIndexList TableView::deleteRepeatList(QModelIndexList indexList)
{
QModelIndex index,newIndex;
QModelIndexList newIndexList;
foreach(index,indexList)
{
if (newIndex.row() != index.row())
{
newIndex = index;
newIndexList.append(newIndex);
}
}
return newIndexList;
}