Qt QML-访问QList中存储的QObject类属性

Qt QML-访问QList中存储的QObject类属性,qt,qml,qtquick2,qproperty,Qt,Qml,Qtquick2,Qproperty,我在访问QML中的属性时遇到问题 QList是一个属性,我可以访问它,但是当我尝试访问QML中classB的属性时,我得到类型错误/未定义。代码如下: [编辑1]-根据建议将QList更改为QVariantList: //ClassA.h #include <QObject> #include "classb.h" Q_DECLARE_METATYPE(QList<ClassB*>) class ClassA : public QObject { Q_OBJEC

我在访问QML中的属性时遇到问题

QList是一个属性,我可以访问它,但是当我尝试访问QML中classB的属性时,我得到类型错误/未定义。代码如下:

[编辑1]-根据建议将QList更改为QVariantList:

//ClassA.h

#include <QObject>
#include "classb.h"

Q_DECLARE_METATYPE(QList<ClassB*>)
class ClassA : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QVariantList objList READ getClassBDetails) //[EDIT 1]

public:
    explicit ClassA(QObject *parent = nullptr);

    QVariantList getClassBDetails(); //[EDIT 1]

private:
    QVariantList  m_list; //[EDIT 1]
    ClassB m_Bobj;

};
#include <QObject>

class ClassB : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int val READ getval WRITE setval NOTIFY valChanged)
public:
    explicit ClassB(QObject *parent = nullptr);

    int m_val = 10;

    int getval();
    void setval(int val);

signals:
    void valChanged();

public slots:
};
//ClassB.h

#include <QObject>
#include "classb.h"

Q_DECLARE_METATYPE(QList<ClassB*>)
class ClassA : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QVariantList objList READ getClassBDetails) //[EDIT 1]

public:
    explicit ClassA(QObject *parent = nullptr);

    QVariantList getClassBDetails(); //[EDIT 1]

private:
    QVariantList  m_list; //[EDIT 1]
    ClassB m_Bobj;

};
#include <QObject>

class ClassB : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int val READ getval WRITE setval NOTIFY valChanged)
public:
    explicit ClassB(QObject *parent = nullptr);

    int m_val = 10;

    int getval();
    void setval(int val);

signals:
    void valChanged();

public slots:
};
//Main.cpp

#include "classa.h"

ClassA::ClassA(QObject *parent) : QObject(parent)
{
    m_list.append(QVariant::fromValue(&m_Bobj)); //** Appending to QvariantList
}

QVariantList  ClassA ::getClassBDetails() //[EDIT 1]
{
    return m_list;
}
#include "classb.h"
ClassB::ClassB(QObject *parent) : QObject(parent)
{

}

int ClassB::getval()
{
    return m_val;
}

void ClassB::setval(int val)
{
    m_val = val;
    emit valChanged();
}
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "classa.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    ClassA aObj;
    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("classAObj",&aObj);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

如果我尝试访问
“classAObj.objList[0].val”
我得到
类型错误:无法读取未定义的
错误的属性“val”。我在这里做错了什么?

你做错的是期待
[]
操作员工作。不会的

如果将
QList
转换为
QVariantList
,QML将自动转换为JS数组,那么有一种方法可以让它工作

但我实际上建议您只需使用辅助功能,实现
get(index)
,必要时还可以实现
set(index)
功能,这样您就可以进行设置了


您还可以看看这个,它非常灵活、强大且有用,支持任何
QObject
子对象,包括在QML中定义的对象、声明性和嵌套定义,最后但并非最不重要的是,它可以直接用作模型。

我实际上尝试过QVariantList,但是我不能向它插入
ClassB
对象。你能举个例子吗?我不确定这种隐式转换的列表是如何“可编辑”的。我建议你不要为此烦恼。如果你想从C++插入,你显然会插入一个<代码> qValu::OfValue[ObjtR ] < /C> >,因为它只是一个<代码> qList你插入了相同的方式插入到任何代码> qList。谢谢,我现在可以通过了。之后,我可以使用
[]
操作符访问吗??因为我确实喜欢这个
var res=classAObj.objDetails
,后来我试着像这样打印它
res[0]
。。。并得到相同的错误..您是否更改为
QVariantList
?它应该会起作用。您可能需要从可调用的
Q_
函数返回,而不是使用属性。正如我已经建议的那样——不要为此烦恼。不太清楚你为什么坚持要让你的生活更艰难。是的,我在
Q_属性
声明中做了更改,还将函数类型
getClassBDetails
返回到QVariantList,它不起作用。我还将
getClassBDetails
更改为
Q\u INVOKABLE
,并直接从QML调用,即使这样做不起作用。我不知道为什么它不起作用。