1. 程式人生 > >QAbstractTableModel最簡單的應用

QAbstractTableModel最簡單的應用

QAbstractTableModel 是 Qt 中的一個抽象類(繼承於QAbstractItemModel),在某些應用場景下我們可能會繼承該類來實現一些特殊業務邏輯。

例如:有時候我們的模型中某列儲存的資料是整數型別,但是顯示在檢視中的時候是需要顯示成字串,這時候 QAbstractTableModel 就派上用場了。即通過map來對映,在data方法中處理。以下程式碼實現最簡單的應用,即不提供外部修改介面,只提供資料。

modelex.h

#ifndef MODELEX_H
#define MODELEX_H

#include <QAbstractTableModel>
#include <QMap>
#include <QVector>

class ModelEx : public QAbstractTableModel
{
    Q_OBJECT

public:
    explicit ModelEx(QObject *parent=nullptr);
    virtual int columnCount(const QModelIndex &parent) const;
    virtual int rowCount(const QModelIndex &parent) const;
    virtual QVariant data(const QModelIndex &index, int role) const;
    virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;

private:
    //軍種,種類,武器數量;前兩者需要對映
    QVector<short>army;
    QVector<short>weaponType;
    QStringList weaponNumber;
    QStringList header;

    //對映
    QMap<short,QString>armyMap;
    QMap<short,QString>weaponTypeMap;
    //初始化對映
    void initMap();
    //內部填充資料的方法
    void populateData();

};

#endif // MODELEX_H

modelex.cpp

#include "modelex.h"

ModelEx::ModelEx(QObject *parent)
    : QAbstractTableModel(parent)
{
    initMap();
    populateData();
}

int ModelEx::columnCount(const QModelIndex &parent) const
{
    //固定三列
    return 3;
}

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

QVariant ModelEx::data(const QModelIndex &index, int role) const
{
    if(!index.isValid()){
        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 weaponNumber[index.row()];
            break;
        default:
            return QVariant();
        }
    }
    return QVariant();
}

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

void ModelEx::initMap()
{
    //兵種對映
    armyMap[0] = tr("海軍");
    armyMap[1] = tr("陸軍");
    armyMap[2] = tr("空軍");
    armyMap[3] = tr("海軍陸戰隊");

    //武器型別
    weaponTypeMap[0] = tr("左輪");
    weaponTypeMap[1] = tr("AK");
    weaponTypeMap[2] = tr("98K");
    weaponTypeMap[3] = tr("AWM");
    weaponTypeMap[4] = tr("SKS射手步槍");
    weaponTypeMap[5] = tr("M24");


}

void ModelEx::populateData()
{
    header<<tr("軍種")<<tr("武器")<<tr("武器數量");
    army<<0<<1<<2<<3<<2<<1;
    weaponType<<0<<1<<2<<3<<4<<5;
    weaponNumber<<tr("123")<<tr("235")<<tr("5673")<<tr("111")<<tr("34")<<tr("99");
}

main.cpp

#include <QApplication>
#include <QTableView>
#include <modelex.h>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTableView view;
    ModelEx model;
    view.setModel(&model);
    view.resize(300,300);
    view.show();

    return a.exec();
}