38.Qt模型/視圖結構
阿新 • • 發佈:2018-04-16
str 框架 sse row 映射 函數 ade TreeView object
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 }
38.Qt模型/視圖結構