参考如何使用QAbstractItemModel定制自己想要的数据模型
树结构只有两层,父节点和子节点
与table的model不同,需自定义节点结构体,体现父子关系,以便重写index、parent、rowCount()等函数
子节点的第0列可选中
mymodel.h
#ifndef MYMODEL_H
#define MYMODEL_H
#include <QAbstractItemModel>
struct Water
{
QString name;
QString prace;
QString weight;
};
struct MyItem
{
int level;
bool checked;
Water data;
QList<MyItem *> children;
};
typedef QList<MyItem *> ItemList;
class MyModel : public QAbstractItemModel
{
public:
MyModel(QObject *parent= 0);
~MyModel();
// 返回当前节点,parent为当前节点的父节点(可能无效,无父节点)
virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
// 返回当前child节点的父节点
virtual QModelIndex parent(const QModelIndex &child) const;
// 返回当前parent节点的子节点的个数(行数),如果没有父节点,则返回0级节点的个数(行数)
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
// 返回当前列数,固定的
virtual int columnCount(const QModelIndex &parent = QModelIndex()) const;
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
// 设置1级节点的第0列的选中状态
virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
// 设置1级节点的第0列可改变选中状态
Qt::ItemFlags flags(const QModelIndex &index) const;
// 设置表头
virtual QVariant headerData(int section, Qt::Orientation orientation,int role = Qt::DisplayRole) const;
void setMData();
QVariant getItemData(MyItem *item,int col) const;
ItemList getMData();
private:
ItemList m_data;
MyItem *m_root;
};
#endif // MYMODEL_H
mymodel.cpp
#include "mymodel.h"
#