Михаил Сермяжко
March 29, 2022, 2:42 p.m.

Автоматически обновляться от 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
  • April 19, 2022, 3:28 p.m.

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

    Comments

    Only authorized users can post comments.
    Please, Log in or Sign up
    • Last comments
    • Evgenii Legotckoi
      March 9, 2025, 9:02 p.m.
      К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
    • VP
      March 9, 2025, 4:14 p.m.
      Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
    • ИМ
      Nov. 22, 2024, 9:51 p.m.
      Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
    • Evgenii Legotckoi
      Oct. 31, 2024, 11:37 p.m.
      Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
    • A
      Oct. 19, 2024, 5:19 p.m.
      Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html