天天看點

Qt MVC之自定義模型

        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程式設計

繼續閱讀