Используйте QAbstractListModel в другом

У меня возникла проблема при попытке разработать модель данных для моего приложения с помощью Qt / QML.
Я уже использовала QAbstractListModel чтобы можно было передавать таможенную модель данных из C ++ в QML, и она работала как шарм с простой моделью (такой как модель, основанная на строках и логических выражениях).

Но теперь мне нужно построить более сложную модель, и мне было интересно, можно ли использовать QAbstractListModel внутри другого QAbstractListModel,

Позвольте мне объяснить себя.
У меня есть модель данных под названием model_A построить так:

model_A.h:

#ifndef MODEL_A_H
#define MODEL_A_H

#include <QAbstractListModel>
#include <QList>

class model_A
{
public:
model_A(const QString& _string1,const QString& _string2,const bool& _bool);
QString m_string1;
QString m_string2;
bool m_bool;
};
class abstractmodel_A : QAbstractListModel
{
Q_OBJECT
public:
(here I implemented all the roles functions and overloaded fonctions needed for the model to work)
private:
QList<model_A> m_model_A;
};
#endif // ANSWERS_H

И тогда мне нужно использовать эту модель внутри другой под названием model_B:

model_B.h:

#ifndef MODEL_B_H
#define MODEL_B_H

#include <QAbstractListModel>
#include <QList>
#include "model_A.h"
class model_B
{
public:
model_B(const QString& _string1,const QString& _string2,const abstractmodel_A& _modelA);
QString m_string1;
QString m_string2;
abstractmodel_A m_modelA;
};
class abstractmodel_B : QAbstractListModel
{
Q_OBJECT
public:
(here I implemented all the roles functions and overloaded fonctions needed for the model to work)
QList<model_B> m_model_B;
};
#endif // ANSWERS_H

Возможно ли это со всей проблемой ограничения DISABLE_COPY в QAbstractListModel или я должен найти другой способ построения моей модели данных?

Спасибо.

3

Решение

В model_BВы можете хранить указатель на abstractmodel_A поэтому DISABLE_COPY не будет проблемой:

class model_B
{
public:
abstractmodel_A * m_modelA;
};

model_B modelBObject;
modelBObject.m_modelA = new abstractmodel_A(/*parent*/);

Далее создайте model_A_role в abstractmodel_B поэтому QML может обращаться к модели A в делегатах. внутри abstractmodel_B::data функция, вы должны конвертировать abstractmodel_A * в QVariant, поскольку abstractmodel_A Inheirts от QAbstractListModel, который является QObjectпреобразование типов может быть просто сделано следующим образом:

QVariant abstractmodel_B::data(const QModelIndex &index, int role) const
{
//...
if (role == Model_A_Role)
{
return QVariant::fromValue<QObject *>(m_model_B[index.row()].m_modelA);
}
}

Наконец, вернемся к QML, используйте ListView для обработки моделей C ++:

ListView {
model: model_B
delegate: Item {
ListView {
model: model_A_role
delegate: DelegateForModelA { /*...*/ }
}
//...
}
}

А также DelegateForModelA может напрямую получить доступ к ролям в model_A,

5

Другие решения


По вопросам рекламы [email protected]