多选设置:(查看qt帮助了解更多)
ui->tableView->setSelectionBehavior:用来设置选中的是单元格,行还是列,
setSelectionMode:用来设置单选,多选,扩展选择(Ctrl+Shift键),相邻,不选中。
对选中的处理:一般的,如下代码就可以:
QItemSelectionModel *model_selection = ui->tableView->selectionModel();
QModelIndexList IndexList= model_selection->selectedIndexes();
QMap<int,int>rowMap;
foreach (QModelIndex index, IndexList)
{
//处理略 ... 可以读取、修改其内容;
}
注意:
- 上面代码中QModelIndexList记录的是所有选中的item的index,而不是行的index,不管你的选中模式是行还是item;
- 如果想对整行处理的话,需要避免对同一行多次操作;比如可以index.column()==0时进行操作处理;
- 如果删除选中的多行,更需要当心进坑!model.removeRow(row)之后,之后的行号就变了(减少1),可不幸的是,选中记录里的行号没有变化,还是原来的行号,再进行删除就删错行了。(比如,要删除2,4行,删了第2行后,原来的第4行变成了第3行,可是你删除的还是记录里的第4行!)所以删除多个行时,要从后往前删除,先删除行号大的,对小的没影响。
- 可以用Qmap记录删除的行,因为他是排序的,省去麻烦
- 删除多行完整代码如下:
QItemSelectionModel *model_selection = ui->tableView->selectionModel(); QModelIndexList IndexList= model_selection->selectedIndexes(); QMap<int,int>rowMap; foreach (QModelIndex index, IndexList) { if(! index.isValid()) return; if(index.column()!=0) continue; rowMap.insert(index.row(),0); } QMapIterator<int,int> Iterator(rowMap); Iterator.toBack(); while(rowMapIterator.hasPrevious()) { rowMapIterator.previous(); int rowm=rowMapIterator.key(); qDebug()<<"del row..."<<rowm; file_model->removeRow(rowm); }
如上!