QT学习笔记14(Qt模型视图结构)

一、基础知识

1、MVC设计模式:是一种与用户界面相关的设计模式,通过此模式,可以有效的分离数据和用户界面。

MVC包括三个要素:

  • 表示数据的模型(Model):应用程序的对象
  • 表示用户界面的视图(View):屏幕演示
  • 定义用户在界面上操作的控制器(Controller):定义了用户界面相应用户输入的方式

2、Qt的InterView框架:

与MVC模式类似,将MVC的视图和控制器部件结合在一起,又引入了代理,通过代理,能够自定义数据条目的显示和编辑方式。

  • 模型(Model):通知视图关于改变由数据源保持的数据
  • 视图(View):提供了关于用户交互显示的项目信息
  • 代理(Delegate):当编辑时告诉模型和视图的编辑状态

 模型与数据源进行通信,在这个体系结构中为其它组件提供了一个接口。

视图从模型中得到模型索引,这些都引用到数据项。通过为模型提供模型索引,视图可以从数据源中检索数据项。

二、应用举例

实现自定义模型:

自定义模型:通过实现将数值代码转换为文字模型

1、新建mainwindow窗口,不带设计界面,新建modelex类

2、modelex.h文件设计如下

#ifndef MODELEX_H
#define MODELEX_H

#include <QAbstractTableModel>
#include <QVector>
#include <QMap>
#include <QStringList>
class ModelEx : public QAbstractTableModel
{
public:
    explicit ModelEx(QObject *parent=0);
    //虚函数声明										//(a)
    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;
signals:

public slots:
private:
    QVector<short> army;
    QVector<short> weaponType;
    QMap<short,QString> armyMap;	//使用QMap数据结构保存“数值—文字”的映射
    QMap<short,QString> weaponTypeMap;
    QStringList  weapon;
    QStringList  header;
    void populateModel();			//完成表格数据的初始化填充
};

#endif // MODELEX_H

3、mian.cpp文件设计如下

#include "mainwindow.h"
#include <QApplication>
#include "modelex.h"
#include <QTableView>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    ModelEx modelEx;//实例化自定义类
    QTableView view;
    view.setModel(&modelEx);//设置视图对象模型
    view.setWindowTitle(QObject::tr("modelEx"));//设置窗口名称
    view.resize(400,400);
    view.show();

    //MainWindow w;
    //w.show();

    return a.exec();
}

4、设计modelex.cpp文件

(1)构造函数

#include "modelex.h"

ModelEx::ModelEx(QObject *parent):QAbstractTableModel(parent)
{
    armyMap[1]=tr("空军");
    armyMap[2]=tr("海军");
    armyMap[3]=tr("陆军");
    armyMap[4]=tr("海军陆战队");
    weaponTypeMap[1]=tr("轰炸机");
    weaponTypeMap[2]=tr("战斗机");
    weaponTypeMap[3]=tr("航空母舰");
    weaponTypeMap[4]=tr("驱逐舰");
    weaponTypeMap[5]=tr("直升机");
    weaponTypeMap[6]=tr("坦克");
    weaponTypeMap[7]=tr("两栖攻击舰");
    weaponTypeMap[8]=tr("两栖战车");
    populateModel();//设置默认显示内容
}

(2)其他函数

//设置默认显示内容
void ModelEx::populateModel()
{
    header<<tr("军种")<<tr("种类")<<tr("武器");
    army<<1<<2<<3<<4<<2<<4<<3<<1;
    weaponType<<1<<3<<5<<7<<4<<8<<6<<2;
    weapon<<tr("B-2")<<tr("尼米兹级")<<tr("阿帕奇")<<tr("黄蜂级")
            <<tr("阿利伯克级")<<tr("AAAV")<<tr("M1A1")<<tr("F-22");
}
//设置列数
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)//(a)DisplayRole用来存取视图中显示的文字
    {
        switch(index.column())
        {
        case 0:
            return armyMap[army[index.row()]];
            break;
        case 1:
            return weaponTypeMap[weaponType[index.row()]];
            break;
        case 2:
            return weapon[index.row()];
        default:
            return QVariant();
        }
    }
    return QVariant();
}
//返回固定的表头数据,设置水平表头的标题
QVariant ModelEx::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);
}

5、显示效果 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值