25.QT-模型视图
2018-06-17 20:28:34来源:未知 阅读 ()
模型视图设计模式的核心思想
- 使模型(数据)与视图(显示)相分离
- 模型只需要对外提供标准接口存取数据,无需数据如何显示
- 视图只需要自定义数据的显示方式,无需数据如何组织存储
- 当数据发生改变时,会通过信号通知视图
- 当用户与视图进行交互时,会通过信号向模型发送交互信息
在QT中提供了以下几种预定义模型:
其中QStandardItemModel的常见子类有:
- QAbstractListModel:用来创建一维列表模型
- QStandardItemModel:用来存储定制数据的通用模型
- QAbstractTableModel: 用来创建二维列表模型
常用的视图类层次结构,如下所示:
在Qt中,不管模型以什么结构组织数据,都必须为每个数据提供不同的索引值,使得视图能通过索引值访问模型中的具体数据
以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()函数如下所示:
QModelIndex QAbstractItemModel::index ( int row, int column, const QModelIndex & parent = QModelIndex() ); //返回指定的row(行)、column(列)、parent(父索引)引所在的索引值
对于不同的模型视图而言,row(行)、column(列)、parent(父索引)的效果如下所示:
以QFileSystemModel为例:
也可以通过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角色,常用的值有:
- Qt::DisplayRole 0 以文本方式显示数据(QString)
- Qt::DecorationRole 1 将数据作为图标来装饰(QIcon,QPixmap)
- Qt::EditRole 2 可编辑的数据信息显示(QString)
- Qt::ToolTipRole 3 作为工具提示显示(QString)
- Qt::StatusTipRole 4 作为状态栏中显示的数据(QString)
- Qt::WhatsThisRole 5 作为帮助信息栏中显示的数据(QString)
- Qt::FontRole 6 设置字体(QFont)
- Qt::TextAlignmentRole 7 设置模型数据的文本对齐(Qt::AlignmentFlag)
- Qt::BackgroundRole 8 设置模型数据的背景色(QBrush)
- Qt::ForegroundRole 9 设置模型数据的前景色,比如字体(QBrush)
以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();
效果:
QTableView详细使用请参考:24.QTableView函数使用,右击菜单实现
未完待续,接下来开始学习模型视图中的委托
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 生产者与消费者模型-有界缓冲区 2020-04-29
- 《深度探索C++对象模型》之《构造函数语义学》——Default C 2019-10-17
- 三、SpringBoot整合Thymeleaf视图 2019-10-09
- c++内存模型 2019-09-23
- VC++ 6.0设计中实现三叉切分窗口与多视图现 2019-06-14
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash