使用到的头文件:
QItemSelectionModel
QItemSelection
QModelIndex
QModelIndexList
例子使用 QTableWidget
3个视图ListView,TableView,TreeView都自带选择模型——selectionModel() 通过该函数获取
tableWidget = new QTableWidget(8, 4);
//创建一个8行4列的TableWidget
QItemSelectionModel * selectionModel = tableWidget->selectionModel();
//实例化一个SelectModel(选择模型),获取当前tableWidget自带的选择模型
在代码中设置选区
需要使用QItemSelection选区对象
QModelIndex leftTop = tableWidget->model()->index(0, 0);
QModelIndex rightBottom = tableWidget->model()->index(5, 2);
//取得两个想要形成选区的index
QItemSelection selection(leftTop, rightBottom);
//将两个index赋值给选区对象,再将选区对象赋值给选择模型
//可以将选择对象理解为创建选区对象
selectionModel->select(selection, QItemSelectionModel::Select);
关于 QItemSelectionModel::Select 设置选择模式:选区中的所有索引指向的item都会被选中
更多的选择模式可参考帮助文档 QItemSelectionModel::SelectionFlags
QItemSelectionModel::Deselect 取消选中
QItemSelectionModel::Toggle 取反的操作: 选中的 ---> 未选中 未选中 ---> 选中
获取选区
需要使用QModelIndexList来接收数据
QModelIndexList indexList = selectionModel->selectedIndexes();
//获取当前选择模型中的选区索引
QString str = "";
for(QModelIndex index : indexList){
str += index.data().toString() + "\n";
}
QMessageBox::information(this, "selectionData", str);
关于选择模型QSelectionModel中的信号
selectionChanged(QItemSelection,QItemSelection)
currentChanged(QModelIndex,QModelIndex)
此处需分清楚,选区(选中区域) 与 当前选中项的区别
选区,是鼠标选择,或代码操作选择后,View中有蓝色颜色的区域,一般这种情况下,最后一个被选中的为当前选中项currentSelection
当前选中项,不管有没有你有没有对View进行选择,都会存在一个当前选中项,如果没有进行选择,那么默认当前选中项为model中的第一个item
选区可以没有,但是当前选中项是一定存在的
回到两个信号
第一个信号selectionChanged(QItemSelection,QItemSelection)
选区更改信号
该信号有两个参数,第一个为当前选区,第二个为上一次的选区
第二个信号currentChanged(QModelIndex,QModelIndex)
选中项更改信号
该信号也有两个参数,第一个为当前选中项,第二个为上一次的选中项