做租赁的行业网站,seo网址查询,基础网站建设,杨凌做网站的1.简介
QAbstractListModel类提供了一个抽象模型#xff0c;可以将其子类化以创建一维列表模型。
QAbstractListModel为将其数据表示为简单的非层次项目序列的模型提供了一个标准接口。它不直接使用#xff0c;但必须进行子类化。
由于该模型提供了比QAbstractItemModel更…1.简介
QAbstractListModel类提供了一个抽象模型可以将其子类化以创建一维列表模型。
QAbstractListModel为将其数据表示为简单的非层次项目序列的模型提供了一个标准接口。它不直接使用但必须进行子类化。
由于该模型提供了比QAbstractItemModel更专业的接口因此不适合与树视图一起使用如果您想提供一个用于此目的的模型则需要对QAbstractItemModel进行子类化。如果您需要使用多个列表模型来管理数据则可能更适合使用子类QAbstractTableModel。 继承QAbstractListModel需要重写rowCount()、data()、insertRows()、removeRows()等函数。
rowCount()函数返回模型的行数。data()函数返回指定索引处的数据。insertRows()插入行removeRows()删除行
2.示例 #ifndef MYLISTMODEL_H
#define MYLISTMODEL_H#include QAbstractListModel
#include QObject
#include QListtypedef struct _student
{QString name;int age;double score;
}Student;class MyListModel : public QAbstractListModel
{Q_OBJECT
public:MyListModel(QObject *parent nullptr);enum RoleNames{Name,Age,Score};public://更新void update(QListStudent students);// 返回列表中行的数量virtual int rowCount(const QModelIndex parent QModelIndex()) const;// 返回指定索引处的数据virtual QVariant data(const QModelIndex index, int role Qt::DisplayRole) const;//插入行virtual bool insertRows(int row, int count, const QModelIndex parent QModelIndex());//删除行virtual bool removeRows(int row, int count, const QModelIndex parent QModelIndex());private:QListStudent m_lstStu;
};#endif // MYLISTMODEL_H#include MyListModel.hMyListModel::MyListModel(QObject *parent): QAbstractListModel(parent)
{}void MyListModel::update(QListStudent students)
{m_lstStu students;for(int i0;im_lstStu.size();i){beginInsertRows(QModelIndex(),i,i);endInsertRows();}
}int MyListModel::rowCount(const QModelIndex parent) const
{Q_UNUSED(parent);return m_lstStu.size();
}QVariant MyListModel::data(const QModelIndex index, int role) const
{if(!index.isValid())return QVariant();int nRow index.row();Student stu m_lstStu.at(nRow);if (role Qt::DisplayRole || role Qt::EditRole){QString ret QString(%1_%2_%3).arg(stu.name).arg(stu.age).arg(stu.score);return ret;}return QVariant();
}bool MyListModel::insertRows(int row, int count, const QModelIndex parent)
{if (row 0 row m_lstStu.size()){beginInsertRows(parent, row, row count - 1);for (int i 0; i count; i){//插入一个空的数据Student stu;stu.name QString();stu.age 0;stu.score 0;m_lstStu.insert(row, stu);}endInsertRows();return true;}return false;
}bool MyListModel::removeRows(int row, int count, const QModelIndex parent)
{if (row 0 row count m_lstStu.size()){beginRemoveRows(parent, row, row count - 1);for (int i 0; i count; i){m_lstStu.removeAt(row);}endRemoveRows();return true;}return false;
}
使用
#include ListForm.h
#include ui_ListForm.h
#include MyListModel.hMyListModel *pModel nullptr;ListForm::ListForm(QWidget *parent) :QWidget(parent),ui(new Ui::ListForm)
{ui-setupUi(this);//去除选中虚线框ui-listView-setFocusPolicy(Qt::NoFocus);//设置整行选中ui-listView-setSelectionBehavior(QAbstractItemView::SelectRows);pModel new MyListModel(this);// 构造数据更新界面QListStudent students;QListQString nameList;nameList张三李四王二赵五刘六;for (int i 0; i 5; i){Student student;student.name nameList.at(i);student.age qrand()%6 13;//随机生成13到19的随机数student.score qrand()%20 80;//随机生成0到100的随机数;students.append(student);}pModel-update(students);ui-listView-setModel(pModel);
}ListForm::~ListForm()
{delete ui;
}void ListForm::on_btnInsert_clicked()
{if(!pModel)return;int row ui-listView-currentIndex().row();if(row 0)return;pModel-insertRows(row1,1);
}void ListForm::on_btnDel_clicked()
{if(!pModel)return;int row ui-listView-currentIndex().row();if(row 0)return;pModel-removeRows(row,1);
}