Михаил Сермяжко
29 марта 2022 г. 14:42

Автоматически обновляться от QAbstractModel

Qt, QAbstractModel

Добрый день.
Наследовал QAbstractModel на с++ и использую ее в QML. Как автоматом обновлять данные в QML при изменении данных в QAbstractModel?
Попробовал с помощью void emitSignalUpdateModel();, но не получилось.

Q_PROPERTY для QML

  1. Q_PROPERTY(ModelRegistration* modelRegistration MEMBER m_modelRegistration CONSTANT)

.h

  1. #ifndef MODELREGISTRATION_H
  2. #define MODELREGISTRATION_H
  3.  
  4. #include <QObject>
  5. #include <QAbstractListModel>
  6.  
  7. struct RegistrationObject
  8. {
  9. RegistrationObject(int id, QString name, bool isDone) {
  10. m_id = id;
  11. m_name = name;
  12. m_isDone = isDone;
  13. }
  14. int m_id;
  15. QString m_name;
  16. bool m_isDone;
  17. };
  18.  
  19. class ModelRegistration : public QAbstractListModel
  20. {
  21. Q_OBJECT
  22. public:
  23. ModelRegistration(QObject *parent = nullptr);
  24.  
  25. enum RoleNames {
  26. IdRole = Qt::UserRole,
  27. NameRole,
  28. IsDoneRole
  29. };
  30.  
  31. QVector<RegistrationObject> vectorDataRegistration;
  32.  
  33. int rowCount(const QModelIndex& parent = QModelIndex()) const override;
  34. QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
  35.  
  36. public slots:
  37. void emitSignalUpdateModel();
  38.  
  39. protected:
  40. QHash<int, QByteArray> roleNames() const override;
  41. };
  42.  
  43. #endif // MODELREGISTRATION_H

.cpp

  1. #include "modelregistration.h"
  2.  
  3. ModelRegistration::ModelRegistration(QObject *parent) : QAbstractListModel(parent)
  4. {
  5. vectorDataRegistration.append(RegistrationObject(1, "Legs (back)", false));
  6. vectorDataRegistration.append(RegistrationObject(2, "Hips (back)", false));
  7. vectorDataRegistration.append(RegistrationObject(3, "Back", false));
  8. vectorDataRegistration.append(RegistrationObject(3, "Arms (back)", false));
  9. vectorDataRegistration.append(RegistrationObject(3, "Hips (front)", false));
  10. vectorDataRegistration.append(RegistrationObject(4, "Belly", false));
  11. vectorDataRegistration.append(RegistrationObject(3, "Arms (front)", false));
  12. }
  13.  
  14. int ModelRegistration::rowCount(const QModelIndex &parent) const
  15. {
  16. return vectorDataRegistration.count();
  17. }
  18.  
  19. QVariant ModelRegistration::data(const QModelIndex &index, int role) const
  20. {
  21. if (index.row() < 0 || index.row() >= vectorDataRegistration.count())
  22. return QVariant();
  23.  
  24. switch (role)
  25. {
  26. case IdRole:
  27. return vectorDataRegistration[index.row()].m_id;
  28. case NameRole:
  29. return vectorDataRegistration[index.row()].m_name;
  30. case IsDoneRole:
  31. return vectorDataRegistration[index.row()].m_isDone;
  32. }
  33.  
  34. return QVariant();
  35. }
  36.  
  37. void ModelRegistration::emitSignalUpdateModel()
  38. {
  39. auto index = this->index(0);
  40. emit dataChanged(index, index, QVector<int>{0,1,2});
  41. }
  42.  
  43. QHash<int, QByteArray> ModelRegistration::roleNames() const
  44. {
  45. QHash<int, QByteArray> roles;
  46. roles[IdRole] = "id";
  47. roles[NameRole] = "name";
  48. roles[IsDoneRole] = "isDone";
  49. return roles;
  50. }
  51.  
2

Вам это нравится? Поделитесь в социальных сетях!

1
Evgenii Legotckoi
  • 19 апреля 2022 г. 15:28

Добрый день
Обычно представление модели в QML действует вполне нормально, когда модель испускает сигнал dataChanged.
То есть по сушеству вам нужно его испускать в тот момент, когда данные действительно изменились. Ну и соответсвенно с тем диапазоном индексов, которые содержат измененные даные.

    Комментарии

    Только авторизованные пользователи могут публиковать комментарии.
    Пожалуйста, авторизуйтесь или зарегистрируйтесь