Qt-5开发及实例-第8章-Qt-5模型-视图结构课件.pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《Qt-5开发及实例-第8章-Qt-5模型-视图结构课件.pptx》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Qt 开发 实例 模型 视图 结构 课件
- 资源描述:
-
1、第第8章章 Qt 5模型模型/视图结构视图结构概概 述述Qt 5模型模型/视图结构视图结构Qt的模型/视图结构分为三部分:模型(Model)、视图(View)和代理(Delegate)。其中,模型与数据源通信,并为其他部件提供接口;而视图从模型中获得用来引用数据条目的模型索引(Model Index)。在视图中,代理负责绘制数据条目,当编辑条目时,代理和模型直接进行通信。模型/视图/代理之间通过信号和槽进行通信,如图8.1所示。数据发生改变时,模型发出信号通知视图。用户对界面进行操作,视图发出信号。代理发出信号告知模型和视图编辑器目前的状态。1模型(模型(Model)2视图(视图(View)3
2、代理(代理(Delegate)0101基基 本本 概概 念念基基 本本 概概 念念1模型(模型(Model)InterView框架中的所有模型都基于抽象基类QAbstractItemModel,此类由QProxyModel、QAbstractListModel、QAbstractTableModel、QAbstractProxyModel、QDirModel、QFileSystemModel、QHelpContentModel和QStandardItemModel类继承。其中,QAbstractListModel类和QAbstractTableModel类是列表和表格模型的抽象基类,如果需要实
3、现列表或表格模型,则应从这两个类继承。完成QStringList存储的QStringListModel类继承自QAbstractListModel类,而与数据库有关的QSqlQueryModel类继承自QAbstractTableModel类;QAbstractProxyModel类是代理模型的抽象类;QDirModel类是文件和目录的存储模型。2视图(视图(View)InterView框架中的所有视图都基于抽象基类QAbstractItemView,此类由QColumnView、QHeaderView、QListView、QTableView和QTreeView类继承。其中,QListVie
4、w类由QUndoView类和QListWidget类继承;QTableView类由QTableWidget类继承;QTreeView类由QTreeWidget类继承。而QListWidget类、QTableWidget类和QTreeWidget类实际上已经包含了数据,是模型/视图集成在一起的类。3代理(代理(Delegate)InterView框架中的所有代理都基于抽象基类QAbstractItemDelegate,此类由QItemDelegate和 QStyledItemDelegate类继承。其中,QItemDelegate类由表示数据库中关系代理的QSqlRelationalDelega
5、te类继承。0202“实例实例”模型模型/视图类使用视图类使用“实例实例”模型模型/视图类使用视图类使用【例】(简单)(CH801)实现一个简单的文件目录浏览器,完成效果如图8.2所示。创建工程“DirModeEx.pro”,其源文件“main.cpp”中的具体代码。其中,其中,(a)QDirModel model:新建一个QDirModel对象,为数据访问做准备。QDirModel的创建还可以设置过滤器,即只有符合条件的文件或目录才可被访问。QDirModel类继承自QAbstractItemModel类,为访问本地文件系统提供数据模型。它提供新建、删除、创建目录等一系列与文件操作相关的函数
6、,此处只是用来显示本地文件系统。(b)tree.setModel(&model):调用setModel()函数设置View对象的Model为QDirModel对象的model。(c)tree.setSelectionMode(QAbstractItemView:MultiSelection):设置QTreeView对象的选择方式为多选。(d)list.setSelectionModel(tree.selectionModel():设置QListView对象与QTreeView对象使用相同的选择模型。(e)table.setSelectionModel(tree.selectionModel()
7、:设置QTableView对象与QTreeView对象使用相同的选择模型。(f)QObject:connect(&tree,SIGNAL(doubleClicked(QModelIndex),&list,SLOT(setRoot Index(QModelIndex)、QObject:connect(&tree,SIGNAL(doubleClicked(QModel Index),&table,SLOT(setRootIndex(QModelIndex);:为了实现双击QTreeView对象中的某个目录时,QListView对象和QTableView对象中显示此选定目录下的所有文件和目录,需要连
8、接QTreeView对象的doubleClicked()信号与QListView对象和QTableView对象的setRootIndex()槽函数。最后运行效果如图8.2所示。“实例实例”模型模型/视图类使用视图类使用第第8章章 Qt 5模型模型/视图结构视图结构模型(模型(Model)模型(模型(Model)【例】(难度一般)(CH802)通过实现将数值代码转换为文字的模型来介绍如何使用自定义模型。此模型中保存了不同军种的各种武器,实现效果如图8.3所示。模型(模型(Model)具体操作步骤如下。(1)ModelEx类继承自QAbstractTableModel类,头文件“modelex.h
9、”中的具体代码如下:#include#include#include#include class ModelEx:public QAbstractTableModelpublic:explicit ModelEx(QObject*parent=0);/虚函数声明/(a)virtual int rowCount(const QModelIndex&parent=QModelIndex()const;virtual int columnCount(const QModelIndex&parent=QModelIndex()const;QVariant data(const QModelIndex&
10、index,int role)const;QVariant headerData(int section,Qt:Orientation orientation,int role)const;signals:public slots:private:QVector army;QVector weaponType;QMap armyMap;/使用QMap数据结构保存“数值文字”的映射 QMap weaponTypeMap;QStringList weapon;QStringList header;void populateModel();/完成表格数据的初始化填充;模型(模型(Model)(2)源
11、文件“modelex.cpp”中的具体代码如下:#include modelex.hModelEx:ModelEx(QObject*parent):QAbstractTableModel(parent)armyMap1=tr(空军);armyMap2=tr(海军);armyMap3=tr(陆军);armyMap4=tr(海军陆战队);weaponTypeMap1=tr(轰炸机);weaponTypeMap2=tr(战斗机);weaponTypeMap3=tr(航空母舰);weaponTypeMap4=tr(驱逐舰);weaponTypeMap5=tr(直升机);weaponTypeMap6=t
12、r(坦克);weaponTypeMap7=tr(两栖攻击舰);weaponTypeMap8=tr(两栖战车);populateModel();模型(模型(Model)populateModel()函数的具体实现代码如下:void ModelEx:populateModel()headertr(军种)tr(种类)tr(武器);army12342431;weaponType13574862;weapontr(B-2)tr(尼米兹级)tr(阿帕奇)tr(黄蜂级)tr(阿利伯克级)tr(AAAV)tr(M1A1)tr(F-22);columnCount()函数中,因为模型的列固定为“3”,所以直接返回
13、“3”。int ModelEx:columnCount(const QModelIndex&parent)const return 3;rowCount()函数返回模型的行数。int ModelEx:rowCount(const QModelIndex&parent)const return army.size();模型(模型(Model)data()函数返回指定索引的数据,即将数值映射为文字。QVariant ModelEx:data(const QModelIndex&index,int role)const if(!index.isValid()return QVariant();if(
14、role=Qt:DisplayRole)/(a)switch(index.column()case 0:return armyMaparmyindex.row();break;case 1:return weaponTypeMapweaponTypeindex.row();break;case 2:return weaponindex.row();default:return QVariant();return QVariant();模型(模型(Model)表8.1列出了Item主要的角色及其描述。常 量描 述Qt:DisplayRole显示文字Qt:DecorationRole绘制装饰数据(
15、通常是图标)Qt:EditRole在编辑器中编辑的数据Qt:ToolTipRole工具提示Qt:StatusTipRole状态栏提示Qt:WhatsThisRoleWhats This文字Qt:SizeHintRole尺寸提示Qt:FontRole默认代理的绘制使用的字体Qt:TextAlignmentRole默认代理的对齐方式Qt:BackgroundRole默认代理的背景画刷Qt:ForegroundRole默认代理的前景画刷Qt:CheckStateRole默认代理的检查框状态Qt:UserRole用户自定义的数据的起始位置模型(模型(Model)headerData()函数返回固定的表
16、头数据,设置水平表头的标题,具体代码如下:QVariant ModelEx:headerData(int section,Qt:Orientation orientation,int role)const if(role=Qt:DisplayRole&orientation=Qt:Horizontal)return headersection;return QAbstractTableModel:headerData(section,orientation,role);模型(模型(Model)(3)在源文件“main.cpp”中,将模型和视图关联,具体代码如下:#include#include
17、 modelex.h#include int main(int argc,char*argv)QApplication a(argc,argv);ModelEx modelEx;QTableView view;view.setModel(&modelEx);view.setWindowTitle(QObject:tr(modelEx);view.resize(400,400);view.show();return a.exec();(4)运行效果如图8.3所示。第第8章章 Qt 5模型模型/视图结构视图结构视图(视图(View)视图(视图(View)【例】(难度中等)(CH803)通过利用自定
18、义的View,实现一个对TableModel的表格数据进行显示的柱状统计图例子,以此介绍如何应用自定义的View。实现效果如图8.4所示。视图(视图(View)具体实现步骤如下。(1)完成主窗体,以便显示View的内容。MainWindow 类继承自QMainWindow类,作为主窗体。以下是头文件“mainwindow.h”的具体代码。#include#include#include#include#include#include#include class MainWindow:public QMainWindow Q_OBJECTpublic:MainWindow(QWidget*par
19、ent=0);MainWindow();void createAction();void createMenu();void setupModel();void setupView();private:QMenu*fileMenu;QAction*openAct;QStandardItemModel*model;QTableView*table;QSplitter*splitter;视图(视图(View)(2)下面是源文件“mainwindow.cpp”中的具体代码:#include mainwindow.h#include MainWindow:MainWindow(QWidget*pare
20、nt):QMainWindow(parent)createAction();createMenu();setupModel();setupView();setWindowTitle(tr(View Example);resize(600,600);MainWindow:MainWindow()void MainWindow:createAction()openAct=new QAction(tr(打开),this);void MainWindow:createMenu()fileMenu=new QMenu(tr(文件),this);fileMenu-addAction(openAct);me
21、nuBar()-addMenu(fileMenu);视图(视图(View)setupModel()函数新建一个Model,并设置表头数据,其具体实现代码如下:void MainWindow:setupModel()model=new QStandardItemModel(4,4,this);model-setHeaderData(0,Qt:Horizontal,tr(部门);model-setHeaderData(1,Qt:Horizontal,tr(男);model-setHeaderData(2,Qt:Horizontal,tr(女);model-setHeaderData(3,Qt:Ho
22、rizontal,tr(退休);视图(视图(View)setupView()函数的具体实现代码如下:void MainWindow:setupView()table=new QTableView;/新建一个QTableView对象 table-setModel(model);/为QTableView对象设置相同的Model QItemSelectionModel*selectionModel=new QItemSelectionModel(model);/(a)table-setSelectionModel(selectionModel);connect(selectionModel,SIGN
23、AL(selectionChanged(QItemSelection,ItemSelection),table,SLOT(selectionChanged(QItemSelection,QItemSelection);/(b)splitter=new QSplitter;splitter-setOrientation(Qt:Vertical);splitter-addWidget(table);setCentralWidget(splitter);其中其中,(a)QItemSelectionModel*selectionModel=new QItemSelectionModel(model):
24、新建一个QItemSelectionModel对象作为QTableView对象使用的选择模型。(b)connect(selectionModel,SIGNAL(selectionChanged(QItemSelection,ItemSelection),table,SLOT(selectionChanged(QItemSelection,QItemSelection):连接选择模型的selectionChanged()信号与QTableView对象的selectionChanged()槽函数,以便使自定义的HistogramView对象中的选择变化能够反映到QTableView对象的显示中。视
25、图(视图(View)(3)此时,运行效果如图8.5所示。视图(视图(View)以上只是实现了简单的主窗体框架显示,还没有完成事件。具体实现步骤如下。(1)在头文件“mainwindow.h”中添加代码如下:public:void openFile(QString);public slots:void slotOpen();(2)在源文件mainwindow.cpp中添加代码如下:#include#include#include#include 其中,其中,在createAction()函数中添加代码如下:connect(openAct,SIGNAL(triggered(),this,SLOT(
展开阅读全文