Qt MVC之自定义模型

      Qt中所有模型都是基于QAbstractItemModel派生的。当数据改变时,模型发出信号通知视图。为了保证数据的存取和表示分离,InterView
引入了模型索引(Model Index)的概念。
       通过模型索引来存取数据条目,必须有三个属性:行号,列号和父条目的模型索引。下面三种常见的模型索引组织方式:
          1.表模型:行和列
          2.列表模型:类似于表模型
          3.树模型:行,列和父索引。
      如果要实现自己的模型,可以从通用的QAbstractItemModel类继承,也可以从类QAbstractListModel和QAbstractTableModel继承实现列表

模型或表格模型。实现自定义模型必须要实现基类的纯虚函数和其他一些特定的函数。

weaponmodel.h文件


  1. #ifndef WEAPONMODEL_H
  2. #define WEAPONMODEL_H
  3. #include <QAbstractTableModel>
  4. #include <QModelIndex>
  5. #include <QStringList>
  6. #include <QVariant>
  7. #include <QVector>
  8. class WeaponModel : public QAbstractTableModel
  9. {
  10. Q_OBJECT
  11. public:
  12. WeaponModel(QObject *parent= 0);
  13. virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
  14. virtual int columnCount(const QModelIndex &parent= QModelIndex()) const;
  15. QVariant data(const QModelIndex &index, int role) const;
  16. QVariant headerData(int section, Qt::Orientation orientation, int role) const;
  17. ~WeaponModel();
  18. private:
  19. QVector< short> army;
  20. QVector< short> weapon;
  21. QStringList type;
  22. QMap< short,QString> armyMap;
  23. QMap< short,QString> weaponMap;
  24. QStringList header;
  25. void populateModel();
  26. };
  27. #endif // WEAPONMODEL_H
weaponmodel.cpp文件

  1. #include "weaponmodel.h"
  2. #include <QDebug>
  3. WeaponModel::WeaponModel(QObject *parent)
  4. : QAbstractTableModel(parent)
  5. {
  6. armyMap[ 1]=tr( "空军");
  7. armyMap[ 2]=tr( "海军");
  8. armyMap[ 3]=tr( "陆军");
  9. armyMap[ 4]=tr( "海军陆战队");
  10. weaponMap[ 1]=tr( "轰炸机");
  11. weaponMap[ 2]=tr( "战斗机");
  12. weaponMap[ 3]=tr( "航空母舰");
  13. weaponMap[ 4]=tr( "驱逐舰");
  14. weaponMap[ 5]=tr( "直升机");
  15. weaponMap[ 6]=tr( "坦克");
  16. weaponMap[ 7]=tr( "两栖攻击舰");
  17. weaponMap[ 8]=tr( "两栖战车");
  18. populateModel();
  19. }
  20. WeaponModel::~WeaponModel()
  21. {
  22. }
  23. int WeaponModel::rowCount( const QModelIndex &parent /*= QModelIndex()*/ ) const
  24. {
  25. return army.size();
  26. }
  27. int WeaponModel::columnCount( const QModelIndex &parent /*= QModelIndex()*/ ) const
  28. {
  29. return 3;
  30. }
  31. QVariant WeaponModel::data( const QModelIndex &index, int role ) const
  32. {
  33. if(!index.isValid())
  34. return QVariant();
  35. qDebug()<<index;
  36. if(role==Qt::DisplayRole)
  37. {
  38. switch(index.column())
  39. {
  40. case 0:
  41. return armyMap[army[index.row()]]; break;
  42. case 1:
  43. return weaponMap[weapon[index.row()]]; break;
  44. case 2:
  45. return type[index.row()];
  46. default:
  47. return QVariant();
  48. }
  49. }
  50. return QVariant();
  51. }
  52. QVariant WeaponModel::headerData( int section, Qt::Orientation orientation, int role ) const
  53. {
  54. if(role==Qt::DisplayRole && orientation == Qt::Horizontal)
  55. return header[section];
  56. return QAbstractTableModel::headerData(section,orientation,role);
  57. }
  58. void WeaponModel::populateModel()
  59. {
  60. header<<tr( "军种")<<tr( "种类")<<tr( "武器");
  61. army<< 1<< 2<< 3<< 4<< 2<< 4<< 3<< 1;
  62. weapon<< 1<< 3<< 5<< 7<< 4<< 8<< 6<< 2;
  63. type<<tr( "b-2")<<tr( "尼米兹级")<<tr( "阿帕奇")<<tr( "黄蜂级")
  64. <<tr( "阿利伯克级")<<tr( "AAAV")<<tr( "M1A1")<<tr( "F-22");
  65. }
main.cpp文件

  1. //#include "mvcexample.h"
  2. #include <QtGui/QApplication>
  3. #include <QTextCodec>
  4. #include <QTableView>
  5. #include "weaponmodel.h"
  6. int main(int argc, char *argv[])
  7. {
  8. QApplication a(argc, argv);
  9. QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
  10. WeaponModel model;
  11. QTableView view;
  12. view.setModel(&model);
  13. view.setWindowTitle(QObject::tr( "自定义模型"));
  14. view.resize( 640, 480);
  15. view.show();
  16. //MVCExample w;
  17. //w.show();
  18. return a.exec();
  19. }

猜你喜欢

转载自blog.csdn.net/u014746838/article/details/80948508