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();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇龍_

若帮助到你,希望能给予鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值