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