Я создал этот класс, чтобы использовать его в качестве контейнера данных. Я читаю из json некоторые данные (в c ++) и заполняю список GUIArea, который я храню в списке m_guiAreas в dataHandler. В определенный момент из QML я запрашиваю серию выделенных областей для dataHandler. DataHandler заполняет QList m_selectedGuiAreas и испускает сигнал selectedAreasChanged (). Теперь я ожидаю увидеть сетку прямоугольника, заполненного выбранными данными, но ничего не вижу.
На уровне C ++, когда выбрана selectedAreasChanged (), результат m_selectedGuiAreas заполнен правильными данными, но на уровне QML он кажется пустым или, возможно, данные считываются неправильно.
Вот класс, который я использую в качестве оболочки для переноса данных на уровень QML:
class GUIArea : public QObject
{
Q_OBJECT
Q_PROPERTY(QString id READ id )
Q_PROPERTY(QString configurations READ configurations )
...
public:
explicit GUIArea(QObject *parent = nullptr): QObject (parent) {}
QString id() {return m_id;}
void id(QString newId) {m_id = newId;}
QString configurations() {return m_configuration; }
void configurations(QString newConfiguration) {m_configuration = newConfiguration;}
...
private:
QString m_id;
QString m_configuration;
};
здесь ниже - класс dataHandler, где я объявляю списки данных, считанных из Json, и которые я конвертирую из Qlist в QQmlPropertyList (я вижу это в некоторых руководствах по QML для предоставления свойств c ++ для QML).
Метод initializeDatas считывает данные, хранящие их в m_GUIAreas, а затем выбирает данные для отправки в QML в m_selectedGUIAreas, испуская в конце сигнал selectedGUIAsChanged ().
class dataHandler : public QObject
{
Q_OBJECT
Q_PROPERTY(QQmlListProperty<GUIArea> selectedGuiAreas READ selectedGuiAreas NOTIFY selectedAreasChanged)
public:
explicit dataHandler(QObject *parent = nullptr);
static dataHandler* instance();
QQmlListProperty<GUIArea> selectedGuiAreas();
...
public slots:
void initializeDatas(const json& blocksList);
...
signals:
...
void selectedAreasChanged();
...
private:
...
QList<GUIArea *> m_guiAreas;
QList<GUIArea *> m_selectedGuiAreas;
};
в основном файле, тогда dataHandler объявляется как свойство:
вот код:
QQuickView view;
...
view.engine()->rootContext()->setContextProperty("dataHandler", dataHandler::instance());
...
view.show();
часть страницы, которую я хочу визуализировать в QML, находится ниже.
AreaButton - это прямоугольник внутри текста и псевдоним текста свойства.
Grid {
id: areasButtonsGrid
columns: 4
anchors.fill: parent
Repeater {
model: dataHandler.selectedGuiAreas
delegate:
AreaButton {
text: qsTr(model.modelData.programName)
}
}
}