DataListModel.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #include "DataListModel.h"
  2. DataListModel::DataListModel(QObject *parent)
  3. : QAbstractListModel(parent), m_nextRole(Qt::UserRole + 1)
  4. {
  5. // 初始化一些默认角色
  6. }
  7. int DataListModel::rowCount(const QModelIndex &parent) const
  8. {
  9. Q_UNUSED(parent);
  10. return m_data.size();
  11. }
  12. QVariant DataListModel::data(const QModelIndex &index, int role) const
  13. {
  14. if (!index.isValid() || index.row() >= m_data.size())
  15. {
  16. return QVariant();
  17. }
  18. const QVariantMap &entry = m_data.at(index.row());
  19. QString roleName = m_roles.value(role);
  20. return entry.value(roleName);
  21. }
  22. QHash<int, QByteArray> DataListModel::roleNames() const
  23. {
  24. return m_roles;
  25. }
  26. bool DataListModel::setData(const QModelIndex &index, const QVariant &value, int role)
  27. {
  28. if (!index.isValid() || index.row() >= m_data.size())
  29. {
  30. return false;
  31. }
  32. QString roleName = m_roles.value(role);
  33. if (roleName.isEmpty())
  34. {
  35. return false;
  36. }
  37. m_data[index.row()][roleName] = value;
  38. emit dataChanged(index, index, {role});
  39. return true;
  40. }
  41. Qt::ItemFlags DataListModel::flags(const QModelIndex &index) const
  42. {
  43. if (!index.isValid())
  44. {
  45. return Qt::NoItemFlags;
  46. }
  47. return Qt::ItemIsEditable | QAbstractListModel::flags(index);
  48. }
  49. void DataListModel::append(const QVariantMap &entry)
  50. {
  51. beginInsertRows(QModelIndex(), m_data.size(), m_data.size());
  52. m_data.append(entry);
  53. endInsertRows();
  54. }
  55. void DataListModel::insert(int index, const QVariantMap &entry)
  56. {
  57. if (index < 0 || index > m_data.size())
  58. {
  59. return;
  60. }
  61. beginInsertRows(QModelIndex(), index, index);
  62. m_data.insert(index, entry);
  63. endInsertRows();
  64. }
  65. void DataListModel::remove(int index)
  66. {
  67. if (index < 0 || index >= m_data.size())
  68. {
  69. return;
  70. }
  71. beginRemoveRows(QModelIndex(), index, index);
  72. m_data.remove(index);
  73. endRemoveRows();
  74. }
  75. void DataListModel::clear()
  76. {
  77. beginResetModel();
  78. m_data.clear();
  79. endResetModel();
  80. }
  81. void DataListModel::setProperty(int index, const QString &property, const QVariant &value)
  82. {
  83. if (index < 0 || index >= m_data.size())
  84. {
  85. return;
  86. }
  87. // 如果属性不存在,自动添加角色
  88. if (!m_roles.key(property.toUtf8())) {
  89. addRole(property);
  90. }
  91. m_data[index][property] = value;
  92. QModelIndex modelIndex = createIndex(index, 0);
  93. int role = m_roles.key(property.toUtf8());
  94. emit dataChanged(modelIndex, modelIndex, {role});
  95. }
  96. QVariantMap DataListModel::get(int index) const
  97. {
  98. if (index < 0 || index >= m_data.size())
  99. {
  100. return QVariantMap();
  101. }
  102. return m_data.at(index);
  103. }
  104. int DataListModel::count() const
  105. {
  106. return m_data.size();
  107. }
  108. void DataListModel::addRole(const QString &roleName)
  109. {
  110. if (m_roles.values().contains(roleName.toUtf8()))
  111. {
  112. return;
  113. }
  114. m_roles[m_nextRole++] = roleName.toUtf8();
  115. // emit roleNamesChanged();
  116. }