QAbstractListModel是Qt框架中的一个抽象类,用于实现数据模型,用于在Qt的视图组件中展示和编辑列表数据。与QAbstractTableModel类似,它也是一个抽象类,提供了一些基本的接口和默认实现,可以方便地创建自定义的列表数据模型。
QAbstractListModel的主要功能包括以下几点:
由于该模型提供了比QAbstractItemModel更专业的接口,因此不适合与树视图一起使用;如果您想提供一个用于此目的的模型,则需要对QAbstractItemModel进行子类化。如果您需要使用多个列表模型来管理数据,则可能更适合使用子类QAbstractTableModel。
继承QAbstractListModel,需要重写rowCount()、data()、insertRows()、removeRows()等函数。
声明数据结构体:
- typedef struct _student
- {
- QString name;
- int age;
- double score;
- }Student;
重写rowCount()、data()、insertRows()和removeRows()等函数。
- #ifndef MYLISTMODEL_H
- #define MYLISTMODEL_H
-
- #include
- #include
- #include
-
- typedef 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(QList
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:
- QList
m_lstStu; - };
-
- #endif // MYLISTMODEL_H
-
-
- #include "MyListModel.h"
-
- MyListModel::MyListModel(QObject *parent)
- : QAbstractListModel(parent)
- {
-
- }
-
- void MyListModel::update(QList
students) - {
- m_lstStu = students;
- for(int i=0;i
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.h"
-
- MyListModel *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);
-
- // 构造数据,更新界面
- QList
students; - QList
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(row+1,1);
- }
-
- void ListForm::on_btnDel_clicked()
- {
- if(!pModel)
- return;
-
- int row = ui->listView->currentIndex().row();
-
- if(row < 0)
- return;
-
- pModel->removeRows(row,1);
- }
Qt 继承QAbstractTableModel实现自定义TableModel-CSDN博客
Qt 继承QAbstractTableModel实现自定义TableModel-CSDN博客