在另一个中使用QAbstractListModel

时间:2015-04-10 09:41:07

标签: c++ qt qml datamodel qabstractlistmodel

尝试使用Qt / QML为我的应用程序开发数据模型时遇到问题。 我已经使用QAbstractListModel能够将海关数据模型从C ++传递到QML,它就像一个简单模型的魅力(例如基于字符串和bool的模型)。

但现在我需要构建一个更难的模型,我想知道是否可以在另一个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

这是可能的,有QAbstractListModel的DISABLE_COPY的所有限制问题,还是我应该找到另一种方法来构建我的数据模型?

谢谢。

1 个答案:

答案 0 :(得分:5)

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的{​​{1}}来自QAbstractListModel,因此类型转换可以像这样完成:

QObject

最后回到QML,使用ListView来处理C ++模型:

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);
    }
}

ListView { model: model_B delegate: Item { ListView { model: model_A_role delegate: DelegateForModelA { /*...*/ } } //... } } 可以直接访问DelegateForModelA中的角色。