zoukankan      html  css  js  c++  java
  • Qt Model/View理解(二)---构造model(细心研读,发现超简单,Model就是做三件事:返回行数量、列数量、data如何显示。然后把model与view联系起来即可,两个例子都是如此)good

    数据是一个集合,显示也是一个集合。例如一篇《西游记》的文章,所有的文字就是数据集合,展示方式就是显示的集合,可以以书本的形式,也可以以电纸书的形式,更可以用视频的方式展现。

    下面是将一个二维数组中的数据显示到TableView控件中。

    1.声明一个model类,继承于QAbstractTableModel

    #define ROW 3
    #define COL 2

    class TableModel : public QAbstractTableModel
    {
    Q_OBJECT
    public:
    TableModel(QObject *parent = 0);
    ~TableModel();
    //QAbstractTableModel 中3个必须重新实现的虚函数
    int rowCount(const QModelIndex & parent = QModelIndex()) const;
    int columnCount(const QModelIndex & parent = QModelIndex()) const;
    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;

    private:
    int num[ROW][COL];
    int nn;
    };
    2.方法实现

    TableModel::TableModel(QObject *parent) :QAbstractTableModel(parent)
    {
    //二维数初始化,从100开始
    nn = 100;
    for(int i=0;i<ROW;++i){
    for(int j=0;j<COL;++j){
    num[i][j] = nn;
    ++nn;
    }
    }
    }

    TableModel::~TableModel()
    {
    }

    //体现model的行数,这里有3行
    int TableModel::rowCount(const QModelIndex & parent) const
    {
    return ROW;
    }

    //体现model的列数,这里有2列
    int TableModel::columnCount(const QModelIndex & parent) const
    {
    return COL;
    }

    //体现model中显示的数据,这里只是num中每一个成员值。
    QVariant TableModel::data(const QModelIndex & index, int role) const
    {
    if (Qt::DisplayRole == role)
    {
    return num[index.row()][index.column()];//返回num二维数组中的值
    }
    return QVariant::Invalid;
    }
    3.将model与QTableView关联起来。

    Widget::Widget(QWidget *parent)
    : QWidget(parent)
    {
    this->resize(300,200);

    TableModel *model = new TableModel();

    QTableView *tableview = new QTableView(this);

    tableview->setModel(model);

    tableview->setGeometry(5,5,280,180);
    }
    4.显示效果,3行2列

    目前的实现都是从定义好的model中取出数据,放在不同的显示控件中,相当于只读,没有对数据部分做任何修改。下一节将以此篇为基础,介绍如何对数据部分进行操作。
    ---------------------
    作者:涛水
    来源:CSDN
    原文:https://blog.csdn.net/lutao614/article/details/80863790
    版权声明:本文为博主原创文章,转载请附上博文链接!

    模型/视图将数据和显示分开进行处理,中间通过代理做桥梁。

    如果想往QCombox中添加一些子项,你会怎么做呢?除了常用的addItem方法,下面介绍通过模型/视图的方式添加,逐步理解模型/视图的使用方法。

    1.首先添加一个类,继承自QAbstractListModel

    class ComboxModel : public QAbstractListModel
    {
    Q_OBJECT
    public:
    ComboxModel(QStringList &_list,QObject *parent = 0);
    ~ComboxModel();
    //QAbstractListModel 中3个必须重新实现的虚函数
    int rowCount(const QModelIndex & parent = QModelIndex()) const;
    int columnCount(const QModelIndex & parent = QModelIndex()) const;
    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;

    private:
    QStringList list;

    };
    2.方法实现

    //将QStringList中的字符串显示在combox中。
    ComboxModel::ComboxModel(QStringList &_list,QObject *parent) :list(_list),QAbstractListModel(parent)
    {
    }

    ComboxModel::~ComboxModel()
    {
    }

    //体现model的行数,这里就是list的个数
    int ComboxModel::rowCount(const QModelIndex & parent) const
    {
    return list.count();
    }

    //体现model的列数,这里只有1列
    int ComboxModel::columnCount(const QModelIndex & parent) const
    {
    return 1;
    }

    //体现model中显示的数据,这里只是list中每一个子项。
    QVariant ComboxModel::data(const QModelIndex & index, int role) const
    {
    if (Qt::DisplayRole == role)
    {
    return list.at(index.row());//返回list每一项
    }
    return QVariant::Invalid;
    }
    3.界面上的combox与model进行关联。

    Widget::Widget(QWidget *parent)
    : QWidget(parent)
    {
    this->resize(200,200);

    QComboBox *combox = new QComboBox(this);
    combox->setGeometry(50,50,100,40);

    QStringList list;
    list<<"123"<<"345"<<"546"<<"apple";
    //创建model并初始化它。
    ComboxModel *model = new ComboxModel(list);

    combox->setModel(model);
    }
    4.最后效果


    ---------------------
    作者:涛水
    来源:CSDN
    原文:https://blog.csdn.net/lutao614/article/details/80859968
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    Java8 lambda表达式10个示例
    我和阿里云RDS的故事
    Spring Mvc 传递参数要controller出现了400,日期参数全局处理,格式化yyyy-MM-dd 和yyyy-MM-dd HH:mm:ss
    剑指Offer_36_两个链表的第一个公共结点
    剑指Offer_35_数组中的逆序对
    剑指Offer_34_找出字符串中第一个只出现一次的字符
    剑指Offer_33_丑数
    剑指Offer_32_把数组排成最小的数
    剑指Offer_31_整数中1出现的次数(从1到n整数中1出现的次数)
    剑指Offer_30_连续子数组的最大和
  • 原文地址:https://www.cnblogs.com/findumars/p/11047046.html
Copyright © 2011-2022 走看看