1 模型/视图类
InterView框架提供了一些可以直接使用的模型类和视图类,如QStandardModel类,QDirModel类,QStringListModel类,以及QColumnView类,QHeaderView类,QListView类,QTableView类和QTreeView类
简单目录浏览器:
1 #include "mainwindow.h" 2 #include <QApplication> 3 4 #include <QAbstractItemModel> 5 #include <QAbstractItemView> 6 #include <QItemSelectionModel> 7 8 #include <QDirModel> 9 #include <QTreeView> 10 #include <QListView> 11 #include <QTableView> 12 #include <QSplitter> 13 14 int main(int argc, char *argv[]) 15 { 16 QApplication a(argc, argv); 17 // MainWindow w 18 // w.show(); 19 20 //新建一个QDirModel对象,为数据访问做准备,QDirModel的创建还可以设置过滤器 21 //即只有符合条件的文件或目录才可被访问 22 //QDirModel类继承自QAbstractItemModel类,为访问本地系统提供数据模型,它提供了如 23 //新建,删除,创建目录等一系列与文件操作相关的函数 24 QDirModel model; 25 26 //新建三种不同的View对象,以便文件目录可以以三种不同的方式显示 27 QTreeView tree; 28 QListView list; 29 QTableView table; 30 31 //设置View对象的Model为QDirModel对象的model 32 tree.setModel(&model); 33 list.setModel(&model); 34 table.setModel(&model); 35 36 //设置QTreeView对象的选择方式为多选 37 //QAbstractItemView提供了五种选择模式,QAbstractItem View::SingleSelection. 38 //QAbstractItemView::NoSelection,QAbstractItemView::ContiguousSelection 39 //QAbstractItemView::ExtendedSelection和QAbstractItemView::MultiSelection 40 tree.setSelectionMode(QAbstractItemView::MultiSelection); 41 //设置QTableView对象与QTreeView对象使用相同的选择模型 42 list.setSelectionModel(tree.selectionModel()); 43 table.setSelectionMode(tree.selectionMode()); 44 45 //为了实现双击QTreeView对象中的某个目录时,QListView对象和QTableView对象显示此选定目录 46 //下的所有文件和目录,需要连接QTreeView对象的doubleClicked()信号与QListView对象的 47 //setRootIndex()槽函数 48 QObject::connect(&tree,SIGNAL(doubleClicked(QModelIndex)),&list, 49 SLOT(setRootIndex(QModelIndex))); 50 QObject::connect(&tree,SIGNAL(doubleClicked(QModelIndex)),&table, 51 SLOT(setRootIndex(QModelIndex))); 52 53 QSplitter *splitter = new QSplitter; 54 splitter->addWidget(&tree); 55 splitter->addWidget(&list); 56 splitter->addWidget(&table); 57 splitter->setWindowTitle(QObject::tr("Model/view")); 58 splitter->show(); 59 60 return a.exec(); 61 }
2 模型
实现自定义模型可以通过QAbstractItemModel类继承,也可以通过QAbstractListModel和QAbstractTableModel类继承实现列表模型或表格模型;
代码示例:
- modelx.h
1 #ifndef MODELEX_H 2 #define MODELEX_H 3 4 #include <QAbstractTableModel> 5 #include <QVector> 6 #include <QMap> 7 #include <QStringList> 8 #include <QObject> 9 10 class modelex:public QAbstractTableModel 11 { 12 public: 13 explicit modelex(QObject *parent=0); 14 15 virtual int rowCount(const QModelIndex &parent=QModelIndex()) const; 16 virtual int columnCount(const QModelIndex &parent=QModelIndex()) const; 17 18 QVariant data(const QModelIndex &index, int role) const; 19 //返回表头的函数 20 QVariant headerData(int section,Qt::Orientation orientation,int role)const; 21 22 private: 23 QVector<short> army; 24 QVector<short> weaponType; 25 26 //数值-文字映射 27 QMap<short,QString> armyMap; 28 QMap<short,QString> weaponTypeMap; 29 30 QStringList weapon; 31 QStringList header; 32 33 //完成表格数据的初始化填充 34 void populateModel(); 35 }; 36 37 #endif // MODELEX_H
- modelx.cpp
1 #include "modelex.h" 2 #include "modelex.h" 3 modelex::modelex(QObject *parent): 4 QAbstractTableModel(parent) 5 { 6 //创建映射 7 armyMap[1]=tr("空军"); 8 armyMap[2]=tr("海军"); 9 armyMap[3]=tr("陆军"); 10 armyMap[4]=tr("海军陆战队"); 11 12 weaponTypeMap[1]=tr("轰炸机"); 13 weaponTypeMap[2]=tr("战斗机"); 14 weaponTypeMap[3]=tr("航空母舰"); 15 weaponTypeMap[4]=tr("驱逐舰"); 16 weaponTypeMap[5]=tr("直升机"); 17 weaponTypeMap[6]=tr("坦克"); 18 weaponTypeMap[7]=tr("两栖攻击舰"); 19 weaponTypeMap[8]=tr("两栖战车"); 20 21 //绘制模型 22 populateModel(); 23 } 24 25 26 27 //获取模型的行数 28 int modelex::rowCount(const QModelIndex &parent) const 29 { 30 return army.size(); 31 } 32 33 //返回模型的列数 34 int modelex::columnCount(const QModelIndex &parent) const 35 { 36 return 4; 37 } 38 39 //返回指定索引的数据,即将数值映射为文字 40 //循环把模型的每行每列给绘制了(函数名不能换成其他名字) 41 QVariant modelex::data(const QModelIndex &index, int role) const 42 { 43 if(!index.isValid()) 44 { 45 return QVariant(); 46 } 47 48 //模型中的条目可以有不同个角色,这样就可以在不同的情况下提供不同的数据. 49 //如,Qt::DisplayRole用来存取视图中显示的文字,角色由枚举类Qt::ItemDataRole定义 50 //Qt::DisplayRole 显示文字 51 //Qt::DecorationRole 绘制装饰数据(通常是图标) 52 //Qt::EditRole 在编辑器中编辑的数据 53 //Qt::ToolTipRole 工具提示 54 //Qt::StatusTipRole 状态栏提示 55 //Qt::WhatsThisRole What‘s This文字 56 //Qt::SizeHintRole 尺寸提示 57 //Qt::FontRole 默认代理的绘制使用的字体 58 //Qt::TextAlignmentRole 默认代理的对齐方式 59 //Qt::BackgroundRole 默认代理的背景画刷 60 //Qt::ForegroundRole 默认代理的前景画刷 61 //Qt::CheckStateRole 默认代理的检查框状态 62 //Qt::UserRole 用户自定义的数据的起始位置 63 if(role==Qt::DisplayRole) 64 { 65 //遍历没一列 66 switch(index.column()) 67 { 68 case 0: 69 //当前行数对应的军队 70 return armyMap[army[index.row()]]; 71 break; 72 case 1: 73 //当前行数对应的类型,以及此类型对应的武器种类 74 return weaponTypeMap[weaponType[index.row()]]; 75 case 2: 76 //当前行数对应的武器 77 return weapon[ index.row() ]; 78 default: 79 return QVariant(); 80 } 81 } 82 return QVariant(); 83 } 84 85 //返回固定的表头数据,设置水平表头的标题(内部循环实现) 86 QVariant modelex::headerData(int section, Qt::Orientation orientation, int role) const 87 { 88 if(role==Qt::DisplayRole&&orientation==Qt::Horizontal) 89 return header[section]; 90 91 return QAbstractTableModel::headerData(section,orientation,role); 92 } 93 94 //绘制 95 void modelex::populateModel() 96 { 97 //表头 98 header<<tr("军种")<<tr("武器种类")<<tr("武器")<<tr("测试"); 99 //军队 100 army<<1<<2<<3<<4<<2<<4<<3<<1; 101 //武器种类 102 weaponType<<1<<3<<5<<7<<4<<8<<6<<3; 103 //武器 104 weapon<<tr("B-2")<<tr("尼米兹级")<<tr("黄蜂级")<<tr("阿利伯克级") 105 <<tr("阿帕奇")<<tr("AAAV")<<tr("M1A1")<<tr("F-22"); 106 }
- main.cpp
1 #include <QApplication> 2 3 #include "modelex.h" 4 #include <QTableView> 5 6 int main(int argc, char *argv[]) 7 { 8 QApplication a(argc, argv); 9 10 modelex modleEx; 11 QTableView view; 12 view.setModel(&modleEx); 13 view.setWindowTitle(QObject::tr("模型示例")); 14 view.resize(400,400); 15 view.show(); 16 return a.exec(); 17 }
原文地址:https://www.cnblogs.com/xiaochi/p/8850325.html
时间: 2024-10-08 02:40:03