QT,对Qtableview设置多选、多行(或item),进行处理时注意事项

多选设置:(查看qt帮助了解更多)

ui->tableView->setSelectionBehavior:用来设置选中的是单元格,行还是列,

setSelectionMode:用来设置单选,多选,扩展选择(Ctrl+Shift键),相邻,不选中。

 对选中的处理:一般的,如下代码就可以:

    QItemSelectionModel *model_selection = ui->tableView->selectionModel();
    QModelIndexList IndexList= model_selection->selectedIndexes();
    QMaprowMap;
    foreach (QModelIndex index, IndexList)
    {
        //处理略  ...  可以读取、修改其内容;
    }

注意:

  1. 上面代码中QModelIndexList记录的是所有选中的item的index,而不是行的index,不管你的选中模式是行还是item;
  2. 如果想对整行处理的话,需要避免对同一行多次操作;比如可以index.column()==0时进行操作处理;
  3. 如果删除选中的多行,更需要当心进坑!model.removeRow(row)之后,之后的行号就变了(减少1),可不幸的是,选中记录里的行号没有变化,还是原来的行号,再进行删除就删错行了。(比如,要删除2,4行,删了第2行后,原来的第4行变成了第3行,可是你删除的还是记录里的第4行!)所以删除多个行时,要从后往前删除,先删除行号大的,对小的没影响。
  4. 可以用Qmap记录删除的行,因为他是排序的,省去麻烦
  5. 删除多行完整代码如下:
        QItemSelectionModel *model_selection = ui->tableView->selectionModel();
        QModelIndexList IndexList= model_selection->selectedIndexes();
        QMaprowMap;
        foreach (QModelIndex index, IndexList)
        {
            if(! index.isValid()) return;
            if(index.column()!=0) continue;
            rowMap.insert(index.row(),0);
        }
    
        QMapIterator Iterator(rowMap);
        Iterator.toBack();
        while(rowMapIterator.hasPrevious())
        {
            rowMapIterator.previous();
            int rowm=rowMapIterator.key();
            qDebug()<<"del row..."<removeRow(rowm);
        }

     如果你有其他好的办法,请你告知,谢谢@!

你可能感兴趣的:(QT相关)