Qt中所有模型都是基于QAbstractItemModel派生的。當資料改變時,模型發出信号通知視圖。為了保證資料的存取和表示分離,InterView
引入了模型索引(Model Index)的概念。
通過模型索引來存取資料條目,必須有三個屬性:行号,列号和父條目的模型索引。下面三種常見的模型索引組織方式:
1.表模型:行和列
2.清單模型:類似于表模型
3.樹模型:行,列和父索引。
如果要實作自己的模型,可以從通用的QAbstractItemModel類繼承,也可以從類QAbstractListModel和QAbstractTableModel繼承實作清單
模型或表格模型。實作自定義模型必須要實作基類的純虛函數和其他一些特定的函數。
weaponmodel.h檔案
#ifndef WEAPONMODEL_H
#define WEAPONMODEL_H
#include <QAbstractTableModel>
#include <QModelIndex>
#include <QStringList>
#include <QVariant>
#include <QVector>
class WeaponModel : public QAbstractTableModel
{
Q_OBJECT
public:
WeaponModel(QObject *parent=0);
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
virtual int columnCount(const QModelIndex &parent= QModelIndex()) const;
QVariant data(const QModelIndex &index, int role) const;
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
~WeaponModel();
private:
QVector<short> army;
QVector<short> weapon;
QStringList type;
QMap<short,QString> armyMap;
QMap<short,QString> weaponMap;
QStringList header;
void populateModel();
};
#endif // WEAPONMODEL_H
weaponmodel.cpp檔案
#include "weaponmodel.h"
#include <QDebug>
WeaponModel::WeaponModel(QObject *parent)
: QAbstractTableModel(parent)
{
armyMap[1]=tr("空軍");
armyMap[2]=tr("海軍");
armyMap[3]=tr("陸軍");
armyMap[4]=tr("海軍陸戰隊");
weaponMap[1]=tr("轟炸機");
weaponMap[2]=tr("戰鬥機");
weaponMap[3]=tr("航空母艦");
weaponMap[4]=tr("驅逐艦");
weaponMap[5]=tr("直升機");
weaponMap[6]=tr("坦克");
weaponMap[7]=tr("兩栖攻擊艦");
weaponMap[8]=tr("兩栖戰車");
populateModel();
}
WeaponModel::~WeaponModel()
{
}
int WeaponModel::rowCount( const QModelIndex &parent /*= QModelIndex()*/ ) const
{
return army.size();
}
int WeaponModel::columnCount( const QModelIndex &parent/*= QModelIndex()*/ ) const
{
return 3;
}
QVariant WeaponModel::data( const QModelIndex &index, int role ) const
{
if(!index.isValid())
return QVariant();
qDebug()<<index;
if(role==Qt::DisplayRole)
{
switch(index.column())
{
case 0:
return armyMap[army[index.row()]]; break;
case 1:
return weaponMap[weapon[index.row()]]; break;
case 2:
return type[index.row()];
default:
return QVariant();
}
}
return QVariant();
}
QVariant WeaponModel::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 WeaponModel::populateModel()
{
header<<tr("軍種")<<tr("種類")<<tr("武器");
army<<1<<2<<3<<4<<2<<4<<3<<1;
weapon<<1<<3<<5<<7<<4<<8<<6<<2;
type<<tr("b-2")<<tr("尼米茲級")<<tr("阿帕奇")<<tr("黃蜂級")
<<tr("阿利伯克級")<<tr("AAAV")<<tr("M1A1")<<tr("F-22");
}
main.cpp檔案
//#include "mvcexample.h"
#include <QtGui/QApplication>
#include <QTextCodec>
#include <QTableView>
#include "weaponmodel.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
WeaponModel model;
QTableView view;
view.setModel(&model);
view.setWindowTitle(QObject::tr("自定義模型"));
view.resize(640,480);
view.show();
//MVCExample w;
//w.show();
return a.exec();
}
如圖:摘自精通Qt4程式設計