栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

QT的MVC模式的解析与实践

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

QT的MVC模式的解析与实践

  1. QT的model/View架构

 

数据源直接与Model交互;

Model与View之间通过Deleget来交互

2. 一个model可以对应多个视图

3. 工程实践

目标做一个表格显示,

Model:用一个QAbstractTableModel的派生类

View: QTableView

具体实现如下:

1) 工程文件与目录结构

除了工程文件,包含三个文件,一个是主程序main.c. 另外两个用于实现派生模型类modelex.h,modelex.cpp

2)ModelEx.pro内容

QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = ModelEx
TEMPLATE = app
SOURCES += main.cpp
#        mainwindow.cpp 
    modelex.cpp
HEADERS  +=     modelex.h
#        mainwindow.h 

3)main.cpp内容

//#include "mainwindow.h"
#include 
#include "modelex.h"
#include 
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    ModelEx modelEx;
    QTableView view;
    view.setModel(&modelEx);
    //view.setWindowTitle(QObject::tr("modelEx"));
    view.setWindowTitle(QString::fromLocal8Bit("扩展模型演示"));
    view.resize(400,400);
    view.show();
 
    return a.exec();
}

4)modelex.h

#ifndef MODELEX_H
#define MODELEX_H
 
#include 
#include 
#include 
#include 
 
class ModelEx : public QAbstractTableModel
{
    Q_OBJECT
public:
    explicit ModelEx(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;
 
signals:
 
public slots:
private:
    QVector army;
    QVector weaponType;
 
    QMap armyMap;
    QMap weaponTypeMap;
 
    QStringList  weapon;
    QStringList  header;
 
    void populateModel();
};
 
#endif // MODELEX_H

5) modelex.cpp

#include "modelex.h"
 
ModelEx::ModelEx(QObject *parent) :
    QAbstractTableModel(parent)
{
    armyMap[1]= QString::fromLocal8Bit("空军");
    armyMap[2]=QString::fromLocal8Bit("海军");
    armyMap[3]=QString::fromLocal8Bit("陆军");
    armyMap[4]=QString::fromLocal8Bit("海军陆战队");
 
    weaponTypeMap[1]=QString::fromLocal8Bit("轰炸机");
    weaponTypeMap[2]=QString::fromLocal8Bit("战斗机");
    weaponTypeMap[3]=QString::fromLocal8Bit("航空母舰");
    weaponTypeMap[4]=QString::fromLocal8Bit("驱逐舰");
    weaponTypeMap[5]=QString::fromLocal8Bit("直升机");
    weaponTypeMap[6]=QString::fromLocal8Bit("坦克");
    weaponTypeMap[7]=QString::fromLocal8Bit("两栖攻击舰");
    weaponTypeMap[8]=QString::fromLocal8Bit("两栖战车");
    populateModel();
}
 
void ModelEx::populateModel()
{
    header< 
    army<<1<<2<<3<<4<<2<<4<<3<<1;
    weaponType<<1<<3<<5<<7<<4<<8<<6<<2;
    weapon< 
}
 
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)
    {
        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);
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/892506.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号