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

Posted

技术标签:

【中文标题】QML - 访问存储在 QList 中的 QObject 类属性【英文标题】:QML - Accessing QObject class properties which is stored in QList 【发布时间】:2017-08-19 08:53:59 【问题描述】:

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

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

[EDIT 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;

;

//ClassA.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;

//ClassB.h

#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.cpp

#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();

//Main.cpp

#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();

//Main.qml

import QtQuick 2.6
import QtQuick.Window 2.2

Window 
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Component.onCompleted: 
        console.log("value========",classAObj.objList[0].val) //** Same error  
    

如果我尝试访问 "classAObj.objList[0].val",则会收到 TypeError: Cannot read property 'val' of undefined 错误。我在这里做错了什么?

【问题讨论】:

【参考方案1】:

您做错了什么是期望 [] 操作员能够工作。不会的。

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

但我实际上推荐的是简单地使用附属函数,实现一个get(index),如果需要,一个set(index) 函数,你就设置好了。

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

【讨论】:

我实际上尝试过使用 QVariantList,但我无法在其中插入 ClassB 对象。您能举个例子吗? 我不确定这种隐式转换的列表有多“可编辑”。我建议你不要为此烦恼。如果你想从 C++ 插入,你显然会插入一个 QVariant::fromValue(objPtr),因为它只是一个 QList&lt;QVariant&gt;,你插入的方式与插入任何 QList 的方式相同。 谢谢,我现在可以通过了。之后我可以使用[ ] 运算符访问吗?因为我确实喜欢这个var res = classAObj.objDetails,后来我尝试打印出类似res[0]的东西......并得到同样的错误.. 你改成QVariantList了吗?它应该工作。您可能需要从 Q_INVOKABLE 函数返回而不是使用属性。正如我已经推荐的那样 - 不要为此烦恼。不完全确定你为什么坚持让你的生活更艰难。 是的,我在 Q_PROPERTY 声明中进行了更改,并将函数 getClassBDetails 的类型返回给 QVariantList,但它不起作用。我还将getClassBDetails 更改为Q_INVOKABLE 并直接从QML 调用,即使这不起作用。我不知道为什么它不起作用。

以上是关于QML - 访问存储在 QList 中的 QObject 类属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QML 中访问基于 QObjectList 的模型中的某些元素

在 Qml 代码中编辑 C++ QList<Object*> 模型的问题和一些 Qml 警告

在 QML 中读取 QList<QPoint>

QML:如何从 C++ 中读取 QList

模型中的 Qt 模型?

访问类 QList Pointer 的成员