模型视图设计模式的核心思想html
在QT中提供了如下几种预约义模型:设计模式
其中QStandardItemModel的常见子类有:函数
经常使用的视图类层次结构,以下所示:工具
在Qt中,无论模型以什么结构组织数据,都必须为每一个数据提供不一样的索引值,使得视图能经过索引值访问模型中的具体数据post
以QTreeView视图为例学习
QWidget w; QFileSystemModel model(&w); //定义文件系统模型 QTreeView treeView(&w); //定义树形显示视图 treeView.resize(600,300); model.setRootPath(QDir::currentPath()); //设置根目录 treeView.setModel(&model); //链接模型与视图 treeView.setRootIndex(model.index(QDir::currentPath())); // setRootInedex():设置树形显示视图的数据索引,以当前目录为根部显示 // QModelIndex index(QDir::currentPath()):以当前目录为模型项索引 w.show();
效果:字体
其中index()是个重载函数,用来获取QModelIndex 索引值,完整的index()函数以下所示:spa
QModelIndex QAbstractItemModel::index ( int row, int column, const QModelIndex & parent = QModelIndex() ); //返回指定的row(行)、column(列)、parent(父索引)引所在的索引值
对于不一样的模型视图而言,row(行)、column(列)、parent(父索引)的效果以下所示:设计
以QFileSystemModel为例:code
也能够经过index索引值来查找数据,以QFileSystemModel模型为例, 与index相关的成员函数有:
QIcon fileIcon ( const QModelIndex & index ); //经过索引值获取文件图标 QFileInfo fileInfo ( const QModelIndex & index ); //经过索引值获取文件信息 QString fileName ( const QModelIndex & index ) ; //经过索引值获取文件名 QString filePath ( const QModelIndex & index ) ; //经过索引值获取文件路径 bool isDir ( const QModelIndex & index ) ; //经过索引值,判断是不是目录 int columnCount ( const QModelIndex & parent = QModelIndex() ) ; //经过索引值获取当前列数 int rowCount ( const QModelIndex & parent = QModelIndex() ) ; //经过索引值获取行数 QModelIndex parent ( const QModelIndex & index ) ; //经过索引值获取其父节点的索引值 QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) ; //经过索引值获取模型数据 bool setData ( const QModelIndex & idx, const QVariant & value, int role = Qt::EditRole ); //经过索引值设置模型数据
其中data ()和setData() 函数的参数role 是模型数据角色
role 数据角色
当role值不一样时,则显示在视图上的方式也会不一样
对于role角色,经常使用的值有:
以QTableView为例
QWidget w; QTableView view(&w); QStandardItemModel model(&w); view.setModel(&model); //设置视图的模型 QStandardItem itemA; /*设置text*/ itemA.setData("A",Qt::DisplayRole); /*设置图标*/ QPixmap pix(":user.png"); pix = pix.scaled(24,24,Qt::KeepAspectRatio); itemA.setData(pix,Qt::DecorationRole); /*设置渐变背景色*/ QLinearGradient back(0,0,100,30); back.setColorAt(0,Qt::white); back.setColorAt(0.5,Qt::green); back.setColorAt(1,Qt::blue); itemA.setData(QBrush(back),Qt::BackgroundRole); model.setItem(0,0,&itemA); model.setItem(0,1,new QStandardItem(QIcon(pix),"B")); model.setItem(1,0,new QStandardItem(QIcon(pix),"C")); w.show();
效果:
接下来开始学习模型视图中的委托