Автоматически обновляться от 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
- AKApril 24, 2025, 12:04 p.m.UPD: Переписал логику воспроизведения через стороннюю библиотеку BASS. Там выбрать можно
- AKApril 1, 2025, 11:41 a.m.Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- Now discuss on the forum
- DTApril 14, 2025, 3:38 p.m.Всем привет! На Qt 6.8 MinGW пытаюсь сделать управление подключением WiFi из программы. Пока делаю поддержку Windows, но так же хочу в дальнейшем внедрить и поддержку Linux/MacOS. Для…
- fFeb. 15, 2025, 1:46 p.m.Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
Добрый день
Обычно представление модели в QML действует вполне нормально, когда модель испускает сигнал dataChanged.
То есть по сушеству вам нужно его испускать в тот момент, когда данные действительно изменились. Ну и соответсвенно с тем диапазоном индексов, которые содержат измененные даные.