使用QAbstractTableModel实现自定义的表格模型

1: Qt模型/视图结构

  qt使用的是InterView模型,InterView里的所有模型都基于抽象基类QAbstractItemModel.

2: QAbstractTableModel类的介绍

  2.1: Q_INVOKABLE virtual int rowCount(const QModelIndex &parent = QModelIndex()) const = 0;

     返回父目录下行数。虚函数需要实现

  2.2: Q_INVOKABLE virtual int columnCount(const QModelIndex &parent = QModelIndex()) const = 0;

     返回父目录下列数。虚函数需要实现

  2.3: Q_INVOKABLE virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const = 0;

     返回在索引引用的项的给定角色下存储的数据。这里返回行数和列数下的  

  2.4 Q_INVOKABLE virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;

      返回固定表头数据

3: 案例

main.c

 1 #include "mainwindow.h"
 2 #include <QApplication>
 3 #include "modelex.h"
 4 #include <QTableView>
 5 int main(int argc, char *argv[])
 6 {
 7     QApplication a(argc, argv);
 8     ModelEx modelEx;
 9     QTableView view;
10     view.setModel(&modelEx);
11     view.resize(400,400);
12     view.show();
13 //    MainWindow w;
14 //    w.show();
15 
16     return a.exec();
17 }

 

 1 #ifndef MODELEX_H
 2 #define MODELEX_H
 3 
 4 #include <QAbstractTableModel>
 5 
 6 class ModelEx : public QAbstractTableModel
 7 {
 8 public:
 9     ModelEx(QObject *parent = 0);
10     virtual int rowCount(const QModelIndex &parent) const;
11     virtual int columnCount(const QModelIndex &parent = QModelIndex()) const;
12     QVariant data(const QModelIndex &index,int role)const;
13     QVariant headerData(int section, Qt::Orientation orientation, int role) const;
14 private:
15     QVector<short> army;
16     QVector<short> weaponType;
17     QMap<short,QString> armyMap;
18     QMap<short,QString> weaponTypeMap;
19     QStringList weapon;
20     QStringList header;
21     void populateModel();
22 
23 };
24 
25 #endif // MODELEX_H
#include "modelex.h"

ModelEx::ModelEx(QObject *parent):QAbstractTableModel(parent)
{
    armyMap[1] = "空军";
    armyMap[2] = "海军";
    armyMap[3] = "陆军";
    armyMap[4] = "海军陆战队";
    weaponTypeMap[1] = "轰炸机";
    weaponTypeMap[2] = "战斗机";
    weaponTypeMap[3] = "航空母舰";
    weaponTypeMap[4] = "驱逐舰";
    weaponTypeMap[5] = "直升机";
    weaponTypeMap[6] = "坦克";
    weaponTypeMap[7] = "两栖攻击舰";
    weaponTypeMap[8] = "两栖战车";
    populateModel();
}

int ModelEx::rowCount(const QModelIndex &parent) const
{
    return army.size();
}

int ModelEx::columnCount(const QModelIndex &parent) const
{
    return 3;
}

QVariant ModelEx::data(const QModelIndex &index, int role) const
{
    if(!index.isValid())//没有索引返回无效数据,不要直接返回0
    {
        return QVariant();
    }
    if(role == Qt::DisplayRole)//显示文字,也是默认显示方式
    {
        switch (index.column()) {
        case 0:
            return armyMap[army[index.row()]];
            break;
        case 1:
            return weaponTypeMap[weaponType[index.row()]];
            break;
        case 2:
            return weapon[index.row()];
            break;
        default:
            return QVariant();
            break;
        }
    }
}

QVariant ModelEx::headerData(int section, Qt::Orientation orientation, int role) const
{
    if(role == Qt::DisplayRole && orientation == Qt::Horizontal){
        return header[section];
    }
    return QAbstractTableModel::headerData(section,orientation,role);
}

void ModelEx::populateModel()
{
    header<<"军种"<<"种类"<<"武器";
    army<<1<<2<<3<<4<<2<<4<<3<<1;
    weaponType<<1<<3<<5<<7<<4<<8<<6<<2;
    weapon<<"B-2"<<"尼米词级"<<"阿帕奇"<<"黄蜂级"<<"阿利伯克级"<<"AAAV"<<"M1A1"<<"F-22";

}

 4:运行结果

 

posted @ 2019-03-20 22:44  Embedder  阅读(6629)  评论(1)    收藏  举报