有关在视图中选择的项的信息存储在QItemSelectionModel类中,这将维护单个模型中项的模型索引,并且独立于任何视图。由于一个模型可以有多个视图,因此可以在视图之间共享选择,从而允许应用程序以一致的方式显示多个视图
选择由选择范围组成。它们通过仅记录每个选定项目的起始和结束模型索引来有效地维护有关大量项目选择的信息。通过使用多个选择范围来描述选择来构造不连续的项目选择
当前项目和所选项目
在视图中,始终存在当前项和选定项 - 两个独立的状态。一个项目可以是当前项目,也可以同时被选中。视图负责确保始终存在当前项,而键盘导航需要当前项来实现。
两者的区别如下:
在操作选择时,将QItemSelectionModel类视为项模型中所有项的选择状态的记录,设置选择模型后,可以选择、取消选择项集合,或者可以切换其选择状态,而无需知道已选择哪些项。可以随时检索所有选定项目的索引,并且可以通过信号和插槽机制通知其他组件选择模型的更改。
使用选择模式:
标准视图类提供可在大多数应用程序中使用的默认选择模型
setSelectionModel() | 设置选择模式,在多个视图之间共享,因此通常不需要构建新的选择模型 |
selectionModel() | 获取选择模式 |
创建一个表格和视图,并设置选择模式:
先获取模型的选择模式,然后修改选择模式
QItemSelectionModel::SelectionFlags
QItemSelectionModel::NoUpdate | 不会进行任何选择。 |
QItemSelectionModel::Clear | 完整的选择将被清除 |
QItemSelectionModel::Select | 将选择所有指定的索引 |
QItemSelectionModel::Deselect | 将取消选择所有指定的索引。 |
QItemSelectionModel::Toggle | 将根据其当前状态选择或取消选择所有指定的索引。 |
QItemSelectionModel::Current | 当前选择将更新。 |
QItemSelectionModel::Rows | 所有索引都将扩展到跨行。 |
QItemSelectionModel::Columns | 所有索引都将扩展为跨列。 |
QItemSelectionModel::SelectCurrent | 为方便起见,提供了“选择”和“当前”的组合。 |
QItemSelectionModel::ToggleCurrent | 为方便起见,提供了切换和电流的组合。 |
QItemSelectionModel::ClearAndSelect | 为方便起见,提供了“清除”和“选择”的组合。 |
QItemSelectionModel::Select 选择所有指定的索引
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QStandardItemModel *model=new QStandardItemModel;//创建一个模型
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
QStandardItem *item=new QStandardItem(QString("%1").arg(i+j));
model->setItem(i,j,item);//添加项
}
}
QTableView *view=new QTableView;//创建一个视图
view->setModel(model);//设置模型
QItemSelectionModel *selectionmodel=view->selectionModel();//获取选择模式
QModelIndex index1=model->index(1,1,QModelIndex());//获取1,1的模型索引
QModelIndex index2=model->index(3,3,QModelIndex());//获取3,3的模型索引
QItemSelection selection(index1,index2);//创建项目选择
selectionmodel->select(selection,QItemSelectionModel::Select);//设置项目选择
view->show();
return a.exec();
}
QItemSelectionModel::Toggle 反转选择状态
selectionmodel->select(selection,QItemSelectionModel::Select);//设置选择
//在上面这行后添加下面的代码
selectionmodel->select(selection,QItemSelectionModel::Toggle);//反转选择
之前时选择的,使用Toggle后,反转,变成没有选择
QItemSelectionModel::Rows 按行选择
QItemSelectionModel *selectionmodel=view->selectionModel();//获取选择模式
QModelIndex index1=model->index(0,1,QModelIndex());//获取1,1的模型索引
QModelIndex index2=model->index(0,2,QModelIndex());//获取3,3的模型索引
QItemSelection selection(index1,index2);//项目选择
selectionmodel->select(selection,QItemSelectionModel::Select|QItemSelectionModel::Rows);//选择一行
QItemSelectionModel::Columns 按列选择
QItemSelectionModel *selectionmodel=view->selectionModel();//获取选择模式
QModelIndex index1=model->index(0,1,QModelIndex());//获取1,1的模型索引
QModelIndex index2=model->index(1,1,QModelIndex());//获取3,3的模型索引
QItemSelection selection(index1,index2);//项目选择
selectionmodel->select(selection,QItemSelectionModel::Select|QItemSelectionModel::Columns);//选择一列
全选
QItemSelectionModel *selectionmodel=view->selectionModel();//获取选择模式
QModelIndex index1=model->index(0,0,QModelIndex());//获取1,1的模型索引
QModelIndex index2=model->index(model->rowCount()-1,model->columnCount()-1,QModelIndex());//获取3,3的模型索引
QItemSelection selection(index1,index2);//项目选择
selectionmodel->select(selection,QItemSelectionModel::Select);//选择全部
读取选择状态:
使用selectionIndexes()获取选择模型中的索引,可以通过该索引来修改被选中的数据
const QModelIndexList modelList=selectionmodel->selectedIndexes();//获取选择的列表
for(const QModelIndex &index:modelList)
{
model->setData(index,"123456");//把选中的数据改为123456
}
常用的信号:
selectionChanged() | 选择改变发出信号 |
currentCahnged() | 项目更改时发出信号 |