gpt4 book ai didi

c++ - 在另一个中使用 QAbstractListModel

转载 作者:太空狗 更新时间:2023-10-29 20:38:58 25 4
gpt4 key购买 nike

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

但现在我需要构建一个更困难的模型,我想知道是否可以在另一个 QAbstractListModel 中使用一个 QAbstractListModel

让我解释一下。我有一个名为 model_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

然后我需要在另一个名为 model_B 的模型中使用该模型:

模型_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 存在所有限制问题,还是我应该找到另一种方法来构建我的数据模型?

谢谢。

最佳答案

model_B 中,您可以存储指向 abstractmodel_A 的指针,因此 DISABLE_COPY 不会成为问题:

class model_B
{
public:
abstractmodel_A * m_modelA;
};

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

接下来,在 abstractmodel_B 中创建 model_A_role,以便 QML 可以访问委托(delegate)中的模型 A。在 abstractmodel_B::data 函数中,您必须将 abstractmodel_A * 转换为 QVariant。由于 abstractmodel_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);
}
}

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

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

并且DelegateForModelA可以直接访问model_A中的角色。

关于c++ - 在另一个中使用 QAbstractListModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29558138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com