Автоматически обновляться от QAbstractModel
Добрый день.
Наследовал QAbstractModel на с++ и использую ее в QML. Как автоматом обновлять данные в QML при изменении данных в QAbstractModel?
Попробовал с помощью void emitSignalUpdateModel();, но не получилось.
Q_PROPERTY для QML
- Q_PROPERTY(ModelRegistration* modelRegistration MEMBER m_modelRegistration CONSTANT)
.h
- #ifndef MODELREGISTRATION_H
- #define MODELREGISTRATION_H
- #include <QObject>
- #include <QAbstractListModel>
- struct RegistrationObject
- {
- RegistrationObject(int id, QString name, bool isDone) {
- m_id = id;
- m_name = name;
- m_isDone = isDone;
- }
- int m_id;
- QString m_name;
- bool m_isDone;
- };
- class ModelRegistration : public QAbstractListModel
- {
- Q_OBJECT
- public:
- ModelRegistration(QObject *parent = nullptr);
- enum RoleNames {
- IdRole = Qt::UserRole,
- NameRole,
- IsDoneRole
- };
- QVector<RegistrationObject> vectorDataRegistration;
- int rowCount(const QModelIndex& parent = QModelIndex()) const override;
- QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
- public slots:
- void emitSignalUpdateModel();
- protected:
- QHash<int, QByteArray> roleNames() const override;
- };
- #endif // MODELREGISTRATION_H
.cpp
- #include "modelregistration.h"
- ModelRegistration::ModelRegistration(QObject *parent) : QAbstractListModel(parent)
- {
- vectorDataRegistration.append(RegistrationObject(1, "Legs (back)", false));
- vectorDataRegistration.append(RegistrationObject(2, "Hips (back)", false));
- vectorDataRegistration.append(RegistrationObject(3, "Back", false));
- vectorDataRegistration.append(RegistrationObject(3, "Arms (back)", false));
- vectorDataRegistration.append(RegistrationObject(3, "Hips (front)", false));
- vectorDataRegistration.append(RegistrationObject(4, "Belly", false));
- vectorDataRegistration.append(RegistrationObject(3, "Arms (front)", false));
- }
- int ModelRegistration::rowCount(const QModelIndex &parent) const
- {
- return vectorDataRegistration.count();
- }
- QVariant ModelRegistration::data(const QModelIndex &index, int role) const
- {
- if (index.row() < 0 || index.row() >= vectorDataRegistration.count())
- return QVariant();
- switch (role)
- {
- case IdRole:
- return vectorDataRegistration[index.row()].m_id;
- case NameRole:
- return vectorDataRegistration[index.row()].m_name;
- case IsDoneRole:
- return vectorDataRegistration[index.row()].m_isDone;
- }
- return QVariant();
- }
- void ModelRegistration::emitSignalUpdateModel()
- {
- auto index = this->index(0);
- emit dataChanged(index, index, QVector<int>{0,1,2});
- }
- QHash<int, QByteArray> ModelRegistration::roleNames() const
- {
- QHash<int, QByteArray> roles;
- roles[IdRole] = "id";
- roles[NameRole] = "name";
- roles[IsDoneRole] = "isDone";
- return roles;
- }
2
252
Do you like it? Share on social networks!
- Last comments
- VPMarch 9, 2025, 4:14 p.m.Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМNov. 22, 2024, 9:51 p.m.Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
- Now discuss on the forum
- fFeb. 15, 2025, 1:46 p.m.Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
- Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.
Добрый день
Обычно представление модели в QML действует вполне нормально, когда модель испускает сигнал dataChanged.
То есть по сушеству вам нужно его испускать в тот момент, когда данные действительно изменились. Ну и соответсвенно с тем диапазоном индексов, которые содержат измененные даные.