自定义模型SearchModel ------ Model-View-Control(MVC)架构(7)

经过检查,发现虽然Qt官方文档说QAbstractTableModel只需实现3个虚函数(rowCount,columnCount,data),但是由于在本模型里,实际的数据是存放在自定义的二维数组里,要让模型找到实际的数据,必须要明确地指明行、列参数,所以还必须实现index函数。一开始正是没有实现这个函数,才会导致模型加载数据失败,出现上篇博客截图的那种结果。

现在将SearchModel代码公布如下,其中已有必要的注释:

search_model.h

#ifndef SEARCH_MODEL_H
#define SEARCH_MODEL_H
class QTableWidgetItem;
class SearchItem;

#include <QAbstractTableModel>

class SearchModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    explicit SearchModel(QObject *parent = 0);

    //以下3个是必须要实现的基类的虚函数
    int rowCount(const QModelIndex &/*parent*/) const;
    int columnCount(const QModelIndex &/*parent*/) const;
    QVariant data(const QModelIndex &index, int role) const;

    //index函数也必须要实现,否则模型无法通过行列来唯一对应到某个item
    QModelIndex index(int row,
                      int column,
                      const QModelIndex &/*parent*/) const;

    //由于条目之间没有父子关系,所以不用实现parent函数,同理index函数中的parent参数也无需用到

private:
    QList<QList<SearchItem*> > listLists;

    QList<SearchItem*> listItems1;
    QList<SearchItem*> listItems2;
    QList<SearchItem*> listItems3;

};

#endif // SEARCH_MODEL_H

search_model.cpp

#include "search_model.h"
#include <QTableWidgetItem>
#include "search_item.h"
#include <QDebug>

SearchModel::SearchModel(QObject *parent) :
    QAbstractTableModel(parent)
{
    SearchItem *item1=new SearchItem(0,1,0,0,0,0,"Tom");

    SearchItem *item2=new SearchItem(0,2,0,0,0,0,"Jerry");

    SearchItem *item3=new SearchItem(0,3,0,0,0,0,"Kitty");

    SearchItem *item4=new SearchItem(0,4,0,0,0,0,"Alice");

    SearchItem *item5=new SearchItem(0,5,0,0,0,0,"Lily");

    SearchItem *item6=new SearchItem(0,6,0,0,0,0,"Mary");

    listItems1.append(item1);
    listItems1.append(item2);
    listItems2.append(item3);
    listItems2.append(item4);
    listItems3.append(item5);
    listItems3.append(item6);
    listLists.append(listItems1);
    listLists.append(listItems2);
    listLists.append(listItems3);
}

int SearchModel::rowCount(const QModelIndex &/*parent*/) const
{
    //直接返回本模型类保存数据的那个私有变量的指示数据个数的值
//    int count=m_itemsList.count();
//    qDebug()<<count;
//    if(count%3==0)
//        return count/3;
//    else
//        return count/3+1;
    return 3;
}

//列数固定位3列
int SearchModel::columnCount(const QModelIndex &/*parent*/) const
{
    return 2;
}

QVariant SearchModel::data(const QModelIndex &index,
                           int role) const
{
    if(role!=Qt::DisplayRole)
        return QVariant();

    if(index.isValid())
    {

        SearchItem *item = static_cast<SearchItem*>(index.internalPointer());
        if(!item)
            return QVariant();
        else
            return QVariant::fromValue(item);
    }
    else
        return QVariant();
}

QModelIndex SearchModel::index(int row,
                               int column,
                               const QModelIndex &/*parent*/) const
{
    if(row<0||column<0)
        return QModelIndex();

    SearchItem *item=listLists[row][column];
    if(!item)
        return QModelIndex();

    return createIndex(row,
                       column,
                       item);
}



现在再次运行,期盼已久的条目终于出现了,这证明模型、视图、委托基本功能都已实现。接下来只是在这个框架上进行调整、进一步美化、优化。

自定义模型SearchModel ------ Model-View-Control(MVC)架构(7)_第1张图片



你可能感兴趣的:(视图,view,Model,模型,qt5)