2017-08-19 10 views
-2

QMLでプロパティにアクセスする際に問題があります。QML - QListに格納されているQObjectクラスのプロパティにアクセスする

QListには財産であり、私はそれにアクセスできるようにしていますが、私は未定義の型エラーを/取得していますQMLでClassBののプロパティにアクセスしようとします。

//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: - QListに変更された提案に基づいQVariantListする

[EDIT 1]次のコードであります

#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

あなたが間違っていることは、[]オペレータが作業することを期待していることです。それはできません。

QListQVariantListに変換して、QMLが自動的にJS配列に変換する方法があります。

私が実際にお勧めするのは、アクセサリ機能を代わりに使用し、get(index)を実装し、必要に応じてset(index)機能を実装して設定していることです。

また、QObject子供をサポートする非常に柔軟性があり、強力で有用なこのgeneric object list modelを見ることができます.QML、宣言的およびネストされた定義で定義されたオブジェクトを含み、モデルとして使用されます。

+0

** QVariantList **で実際に試しましたが、 'ClassB'オブジェクトを挿入できませんでしたか? – pra7

+1

このような暗黙的に変換されたリストがどのように「編集可能」であるかわかりません。私はあなたがそれを気にしないことをお勧めします。 C++から挿入したいのであれば、明らかに 'QVariant :: fromValue(objPtr)'を挿入しているだけで、 'QList 'なので、 'QList'に挿入するのと同じ方法で挿入します。 – dtech

+0

ありがとう、私は今通過することができます。その後、 '[]'演算子を使ってアクセスできますか?なぜなら、この 'var res = classAObj.objDetails'が好きで、後で' res [0] 'のようなものを印刷しようとしたからです。 – pra7

関連する問題