经过检查,发现虽然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);
}
现在再次运行,期盼已久的条目终于出现了,这证明模型、视图、委托基本功能都已实现。接下来只是在这个框架上进行调整、进一步美化、优化。