Qt中所有模型都是基于QAbstractItemModel派生的。当数据改变时,模型发出信号通知视图。为了保证数据的存取和表示分离,InterView
引入了模型索引(Model Index)的概念。
通过模型索引来存取数据条目,必须有三个属性:行号,列号和父条目的模型索引。下面三种常见的模型索引组织方式:
1.表模型:行和列
2.列表模型:类似于表模型
3.树模型:行,列和父索引。
如果要实现自己的模型,可以从通用的QAbstractItemModel类继承,也可以从类QAbstractListModel和QAbstractTableModel继承实现列表
引入了模型索引(Model Index)的概念。
通过模型索引来存取数据条目,必须有三个属性:行号,列号和父条目的模型索引。下面三种常见的模型索引组织方式:
1.表模型:行和列
2.列表模型:类似于表模型
3.树模型:行,列和父索引。
如果要实现自己的模型,可以从通用的QAbstractItemModel类继承,也可以从类QAbstractListModel和QAbstractTableModel继承实现列表
模型或表格模型。实现自定义模型必须要实现基类的纯虚函数和其他一些特定的函数。
weaponmodel.h文件
-
-
-
-
-
-
-
-
-
-
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();
-
-
};
-
-
-
-
-
-
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");
-
}
-
//#include "mvcexample.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();
-
}
-