自己写项目,遇到一个需求,就是需要获取选择区域的行号,这样方便我做上下移动,和光标重选具体实现如下
#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);