在模型视图架构中,视图包含了模型中的数据项,并将他们呈现给用户,而数据的表示方法可能与
参考文献:《Qt Creator 快速入门》第三版 霍亚飞编著
底层存储数据项的数据结构完全不同,这种内容与表现的分离之所以能够实现,是因为使用了QAbstractItemModel提供了一个标准模型接口,还有QAbstractItemView提供的一个标准视图接口,以及使用了模型索引提供了一种通用的方法来表示数据。
除了呈现数据,视图还处理项目间的导航,以及项目选择的某些方面。
处理项目选择
在视图中被选择的项目的信息存储在一个QItemSelectionModel实例中,这样被选择项目的模型索引便保持在一个独立的模型中,与所有的视图都是独立的。选择可以看作是在选择模型中保存的一个模型索引集合,最近的项目选择被成为当前选择。
1、当前项目和被选择的项目
视图中总有一个当前项目和一个被选择的项目,两者是两个独立的状态。两者区别见下表
当前项 | 选择项 |
---|---|
只能有一个当前项目 | 可以有多个被选择的项目 |
使用键盘导航键或者鼠标按键可以改变当前项目 | 项目是否处于被选择状态取决于几个预先定义好的模式,例如,单项选择,多重选择等 |
按下F2键或者双击鼠标都可以编辑当前项目
| 选择项目可以指定一个范围来一起被使用 |
当前项目会显示焦点矩形 | 被选则的项目会使用矩形来表示 |
2、使用选择模型
标准视图类中提供了默认的选择模型,可以在大多数应用中直接使用。属于一个视图类的选择模型可以使用这个视图的selectionMode()函数获得,而且可以在多个视图之间使用setSelectionModel()函数来共享该选择模型。
例子代码
新建Qt Widget应用,项目名称为myselection,其他保持默认不变。然后在mainwindow.h文件中添加类的前置声明如下
class QTableView;
再添加两个prite对象,如下。这里添加两个是为了看到两个视图共享选择模型的效果。
QTableView* tableView;
QTableView* tableView2;
在mainwindow.cpp文件添加头文件
如下
#include <QStandardItemModel>
#include <QTableView>
#include <QDebug>
修改构造函数的内容如下
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//使用标准模型
QStandardItemModel* model=new QStandardItemModel(7,4,this);
//添加模型项
for(int row=0;row<7;row++)
{
for(int colum=0;colum<4;colum++)
{
QStandardItem* item=new QStandardItem(QString("%1").arg(row*4+colum));
model->setItem(row,colum,item);
}
}
tableView=new QTableView;
tableView->setModel(model);
setCentralWidget(tableView);
//获取视图的项目选择模型
QItemSelectionModel* selectionModel=tableView->selectionModel();
//定义左上角和右下角的索引,然后使用这两个索引创建选择
QModelIndex topLeft;
QModelIndex bottomRight;
topLeft=model->index(1,1,QModelIndex());
bottomRight=model->index(5,2,QModelIndex());
QItemSelection selection(topLeft,bottomRight);
//使用指定的选择模式来选择项目
selectionModel->select(selection,QItemSelectionModel::Select);
//共享选择项目
tableView2=new QTableView;
tableView2->setWindowTitle("tableView2");
tableView2->resize(400,300);
tableView2->setModel(model);
tableView2->setSelectionModel(selectionModel);
tableView2->show();
}
运行效果如下
当改变一个视图中的选择项目时,另一个视图中也会改变