QtableView选择范围操作 通过MAP存储选择行 获取最上行号和最下行号 上移下移一行等一系列操作

自己写项目,遇到一个需求,就是需要获取选择区域的行号,这样方便我做上下移动,和光标重选具体实现如下

    #include <QItemDelegate>

   //获取鼠标选择区(tableview一般默认的是行选取,这个在右侧属性里有,很好找,我的需求也仅仅是行选取) 

   QItemSelectionModel *selections = ui->tableViewTransmitControls->selectionModel();  //获取选择区
    QModelIndexList selected = selections->selectedIndexes();   //modelindex存入QModelIndexList 
    QMap<int, int> rowMap;
    foreach (QModelIndex index, selected)    //存入map,同一行的不同列的index的行存入map只存一个,达到只存储选中行的目的
    {
        rowMap.insert(index.row(), 0);
    }
    QMap<int,int>::Iterator iter;

   //获取选取区域的第一行和最后一行(可以方便一次选取连续多行时移动到底或者到顶时出错,或者选取行之间还移动)

   iter = rowMap.end(); 
    iter--; //end()是开区间,如果不- -,会出去,数值不定,一般很大,这个基础之前被我忽略,回去翻书才发现
    int endrow= iter.key();

//获取第一行和最后一行还有如下方法

 int toprow =  selected .at(0).row();  //modelindex的第一个元素肯定在第一行

int bottomRow = selected.at(selected.count()-1).row(); //modelindex

//下移实现

for( iter= rowMap.begin(); iter != rowMap.end();  ++iter)                      //循环选择行数次
    {
        if(bottomRow==(ui->tableViewTransmitMeasures->model()->rowCount()-1))//选中的最后一行到底了;
            return;
        for(int row=topRow; row<=bottomRow; row++)  //确定行
        {
            for(int column=1; column<ui->tableViewTransmitControls->model()->columnCount(); column++) //确定列,第0列我不需要移动,是序号
            {
                QModelIndex curindex = ui->tableViewTransmitControls->model()->index(row,column);//当前行坐标
                QString pCurItem = ui->tableViewTransmitControls->model()->data(curindex).toString();
                QModelIndex nextindex = ui->tableViewTransmitControls->model()->index(row+1,column); //下一行坐标
                QString pNextItem = ui->tableViewTransmitControls->model()->data(nextindex).toString();
                if((pCurItem!=NULL) && (pNextItem!=NULL))
                {
                    QString strTemp = pNextItem;         //该行和上一行某列完成数据交换
                    pNextItem = pCurItem;
                    pCurItem = strTemp;
                    ui->tableViewTransmitControls->model()->setData(curindex,pCurItem);  //交换后的数据写入界面
                    ui->tableViewTransmitControls->model()->setData(nextindex,pNextItem);
                }
            }
        }
    }



//移动成功后,让选取光标跟着移动

QItemSelection selection;
    QModelIndex leftup =ui->tableViewTransmitControls->model()->index(topRow-1, 0);
    QModelIndex rightdown =ui->tableViewTransmitControls->model()->index(bottomRow-1,ui->tableViewTransmitControls->model()->columnCount()-1);
    QItemSelection sel(leftup, rightdown);
    selection.merge(sel, QItemSelectionModel::Select);  //将每一个单元格每一行都作为一个QItemSelection对象并拼接到总的QItemSelection对象中
    selections->clear();   //先清空原来的选择区域
    selections->select(selection, QItemSelectionModel::Select);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值