C++ 在另一个模型中使用QAbstractListModel

C++ 在另一个模型中使用QAbstractListModel,c++,qt,qml,datamodel,qabstractlistmodel,C++,Qt,Qml,Datamodel,Qabstractlistmodel,我在尝试使用Qt/QML为我的应用程序开发数据模型时遇到了一个问题。 我已经使用了 QuastListMeals/COD>来将海关数据模型从C++传递到QML,并且它的工作方式像一个简单模型的魅力(例如基于字符串和布尔的模型)。 但现在我需要构建一个更难的模型,我想知道是否可以在另一个QAbstractListModel中使用QAbstractListModel 让我解释一下。 我有一个名为model\u a的数据模型,构建方式如下: 型号A.h: #ifndef MODEL_A_H #defi

我在尝试使用Qt/QML为我的应用程序开发数据模型时遇到了一个问题。 我已经使用了<代码> QuastListMeals/COD>来将海关数据模型从C++传递到QML,并且它的工作方式像一个简单模型的魅力(例如基于字符串和布尔的模型)。 但现在我需要构建一个更难的模型,我想知道是否可以在另一个
QAbstractListModel
中使用
QAbstractListModel

让我解释一下。 我有一个名为
model\u a
的数据模型,构建方式如下:

型号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
这是可能的,因为禁用QAbstractListModel的拷贝存在所有限制问题,还是我应该找到另一种方法来构建我的数据模型


谢谢。

模型B
中,您可以存储指向
抽象模型a
的指针,因此禁用复制不会有问题:

class model_B
{
public:
   abstractmodel_A * m_modelA;
};

model_B modelBObject;
modelBObject.m_modelA = new abstractmodel_A(/*parent*/);
接下来,在
abstractmodel\u B
中创建
model\u角色
,以便QML可以访问委托中的模型A。在
abstractmodel_B::data
函数中,必须将
abstractmodel_A*
转换为
QVariant
。由于
abstractmodel\u A
来自
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);
    }
}

而且
DelegateForModelA
可以直接访问
model_A

中的角色,如果您使用指针,那么它将起作用。谢谢您的建议。我想我设法让它从C++侧工作。但你们知道我如何通过qml中的模型B访问模型A的角色吗?你们的问题我不清楚-你们想如何在模型B中使用模型A?您想要实现什么目标?我正在寻找一种方法,以便能够在另一个模型中实现QAbstractModel。比如,如果我定义了一个模型,称为轮辋和轮胎的车轮混合物,我想把这个模型用在车轮和其他东西的汽车混合物模型中。我不知道我的例子是否能帮助你理解我的目标。但无论如何,麦丘给了我一个对我有用的答案。谢谢你为我花了这么多时间。很抱歉回答得太晚。谢谢你,它工作得很好,正如你所描述的!
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 { /*...*/ }
        }
        //...
    }
}