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