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

时间:2017-08-19 08:53:59

标签: 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_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 个答案:

答案 0 :(得分:1)

你做错了是希望String str = "aaaaabbb"; String strArray[] = str.split("(?<=(.))(?!\\1)"); for(String value : strArray){ System.out.println(value); } 运营商能够运作。它不会。

如果将[]转换为QList,QML会自动转换为JS数组,有一种方法可以使其正常工作。

但我实际建议的是简单地使用附件功能,实现QVariantList并在必要时使用get(index)功能并设置。

您还可以查看此generic object list model,它非常灵活,功能强大且有用,支持任何set(index)子级,包括在QML中定义的对象,声明性和嵌套定义以及最后一个不仅如此,它可以直接用作模型。