1. 程式人生 > >38.Qt模型/視圖結構

38.Qt模型/視圖結構

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模型/視圖結構