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

多选设置:(查看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)
    {
        //处理略  ...  可以读取、修改其内容;
    }

注意:

  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();
        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);
        }

     如上!

  • 11
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值