Михаил Сермяжко29 марта 2022 г. 4:42
Автоматически обновляться от 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; }
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Пожалуйста, авторизуйтесь или зарегистрируйтесь
B
- Bogdannn
- 28 марта 2024 г. 5:15
C++ - Тест 001. Первая программа и типы данных
- Результат:46баллов,
- Очки рейтинга-6
Последние комментарии
Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Анатолий Кононенко5 февраля 2024 г. 12:50
EVA25 декабря 2023 г. 21:30
Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Сейчас обсуждают на форуме
Как получить в массив значения из связанной модели? Спасибо, разобрался:))
AC
QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…
Alexandru Codreanu19 января 2024 г. 22:57
BlinCT27 декабря 2023 г. 19:57
Дмитрий10 января 2024 г. 15:18
Evgenii Legotckoi12 декабря 2023 г. 17:48
Добрый день
Обычно представление модели в QML действует вполне нормально, когда модель испускает сигнал dataChanged.
То есть по сушеству вам нужно его испускать в тот момент, когда данные действительно изменились. Ну и соответсвенно с тем диапазоном индексов, которые содержат измененные даные.