• Qt 继承QAbstractListModel实现自定义ListModel


    1.简介

    QAbstractListModel是Qt框架中的一个抽象类,用于实现数据模型,用于在Qt的视图组件中展示和编辑列表数据。与QAbstractTableModel类似,它也是一个抽象类,提供了一些基本的接口和默认实现,可以方便地创建自定义的列表数据模型。

    QAbstractListModel的主要功能包括以下几点:

    • 数据的获取和设置:通过实现data()和setData()接口,可以用于获取和设置列表中的数据。可以根据自己的数据结构和逻辑,在这两个接口中进行相关的操作。data()方法用于获取指定索引位置的数据,setData()方法用于设置指定索引位置的数据。
    • 列表项的管理:可以通过rowCount()方法获取列表中的项数。也可以通过insertRows()和removeRows()方法动态地增加或删除列表项。
    • 列表的显示和编辑:可以通过实现displayRole和editRole相关方法来确定列表数据在视图中的显示和编辑方式。也可以通过实现flags()方法来指定每个列表项的编辑属性。
    • 数据的排序:可以通过实现sort()方法来对列表中的数据进行排序。

    由于该模型提供了比QAbstractItemModel更专业的接口,因此不适合与树视图一起使用;如果您想提供一个用于此目的的模型,则需要对QAbstractItemModel进行子类化。如果您需要使用多个列表模型来管理数据,则可能更适合使用子类QAbstractTableModel。

    继承QAbstractListModel,需要重写rowCount()、data()、insertRows()、removeRows()等函数。

    • rowCount()函数返回模型的行数。
    • data()函数返回指定索引处的数据。
    • insertRows()插入行
    • removeRows()删除行

    2.示例

    声明数据结构体:

    1. typedef struct _student
    2. {
    3. QString name;
    4. int age;
    5. double score;
    6. }Student;

    重写rowCount()、data()、insertRows()和removeRows()等函数。 

    1. #ifndef MYLISTMODEL_H
    2. #define MYLISTMODEL_H
    3. #include
    4. #include
    5. #include
    6. typedef struct _student
    7. {
    8. QString name;
    9. int age;
    10. double score;
    11. }Student;
    12. class MyListModel : public QAbstractListModel
    13. {
    14. Q_OBJECT
    15. public:
    16. MyListModel(QObject *parent = nullptr);
    17. enum RoleNames{
    18. Name,
    19. Age,
    20. Score
    21. };
    22. public:
    23. //更新
    24. void update(QList students);
    25. // 返回列表中行的数量
    26. virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
    27. // 返回指定索引处的数据
    28. virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
    29. //插入行
    30. virtual bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex());
    31. //删除行
    32. virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex());
    33. private:
    34. QList m_lstStu;
    35. };
    36. #endif // MYLISTMODEL_H
    37. #include "MyListModel.h"
    38. MyListModel::MyListModel(QObject *parent)
    39. : QAbstractListModel(parent)
    40. {
    41. }
    42. void MyListModel::update(QList students)
    43. {
    44. m_lstStu = students;
    45. for(int i=0;isize();i++)
    46. {
    47. beginInsertRows(QModelIndex(),i,i);
    48. endInsertRows();
    49. }
    50. }
    51. int MyListModel::rowCount(const QModelIndex &parent) const
    52. {
    53. Q_UNUSED(parent);
    54. return m_lstStu.size();
    55. }
    56. QVariant MyListModel::data(const QModelIndex &index, int role) const
    57. {
    58. if(!index.isValid())
    59. return QVariant();
    60. int nRow = index.row();
    61. Student stu = m_lstStu.at(nRow);
    62. if (role == Qt::DisplayRole || role == Qt::EditRole)
    63. {
    64. QString ret = QString("%1_%2_%3").arg(stu.name)
    65. .arg(stu.age).arg(stu.score);
    66. return ret;
    67. }
    68. return QVariant();
    69. }
    70. bool MyListModel::insertRows(int row, int count, const QModelIndex &parent)
    71. {
    72. if (row >= 0 && row <= m_lstStu.size())
    73. {
    74. beginInsertRows(parent, row, row + count - 1);
    75. for (int i = 0; i < count; ++i)
    76. {
    77. //插入一个空的数据
    78. Student stu;
    79. stu.name = QString();
    80. stu.age = 0;
    81. stu.score = 0;
    82. m_lstStu.insert(row, stu);
    83. }
    84. endInsertRows();
    85. return true;
    86. }
    87. return false;
    88. }
    89. bool MyListModel::removeRows(int row, int count, const QModelIndex &parent)
    90. {
    91. if (row >= 0 && row + count <= m_lstStu.size())
    92. {
    93. beginRemoveRows(parent, row, row + count - 1);
    94. for (int i = 0; i < count; ++i)
    95. {
    96. m_lstStu.removeAt(row);
    97. }
    98. endRemoveRows();
    99. return true;
    100. }
    101. return false;
    102. }

    使用示例:

    1. #include "ListForm.h"
    2. #include "ui_ListForm.h"
    3. #include "MyListModel.h"
    4. MyListModel *pModel = nullptr;
    5. ListForm::ListForm(QWidget *parent) :
    6. QWidget(parent),
    7. ui(new Ui::ListForm)
    8. {
    9. ui->setupUi(this);
    10. //去除选中虚线框
    11. ui->listView->setFocusPolicy(Qt::NoFocus);
    12. //设置整行选中
    13. ui->listView->setSelectionBehavior(QAbstractItemView::SelectRows);
    14. pModel = new MyListModel(this);
    15. // 构造数据,更新界面
    16. QList students;
    17. QList nameList;
    18. nameList<<"张三"<<"李四"<<"王二"<<"赵五"<<"刘六";
    19. for (int i = 0; i < 5; ++i)
    20. {
    21. Student student;
    22. student.name = nameList.at(i);
    23. student.age = qrand()%6 + 13;//随机生成13到19的随机数
    24. student.score = qrand()%20 + 80;//随机生成0到100的随机数;
    25. students.append(student);
    26. }
    27. pModel->update(students);
    28. ui->listView->setModel(pModel);
    29. }
    30. ListForm::~ListForm()
    31. {
    32. delete ui;
    33. }
    34. void ListForm::on_btnInsert_clicked()
    35. {
    36. if(!pModel)
    37. return;
    38. int row = ui->listView->currentIndex().row();
    39. if(row < 0)
    40. return;
    41. pModel->insertRows(row+1,1);
    42. }
    43. void ListForm::on_btnDel_clicked()
    44. {
    45. if(!pModel)
    46. return;
    47. int row = ui->listView->currentIndex().row();
    48. if(row < 0)
    49. return;
    50. pModel->removeRows(row,1);
    51. }

    3.推荐

    Qt 继承QAbstractTableModel实现自定义TableModel-CSDN博客

    Qt 插件开发详解_qt插件化开发-CSDN博客

    Qt 继承QAbstractTableModel实现自定义TableModel-CSDN博客

     

  • 相关阅读:
    Kotlin高仿微信-第5篇-主页-通讯录
    PostgreSQL数据库统计信息——统计信息系统表
    数学分析_笔记_第3章:极限
    SSM之Mybatis概览
    JAVA毕业设计高校请假管理系统计算机源码+lw文档+系统+调试部署+数据库
    SpringBoot项目中Interceptor拦截器中使用@Autowired注解,运行时会报错空指针
    PPSSPPSDL for Mac v1.17.1 PSP游戏模拟器(附500款游戏) 激活版
    基于Pytorch框架的LSTM算法(二)——多维度单步预测
    浮动元素导致被遮住元素单击事件不响应
    docker容器化搭建mysql8.0的主从复制 [详细说明,步骤简洁]
  • 原文地址:https://blog.csdn.net/wzz953200463/article/details/134247547