2017-08-19 62 views
-2

我無法訪問QML中的屬性。QML - 訪問存儲在QList中的QObject類屬性

的QList是一個屬性,我能夠訪問,但是當我嘗試訪問的屬性CLASSB在QML我得到的錯誤類型/未定義。以下是代碼:

[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中定義的對象,聲明和嵌套定義以及最後但並非最不重要的,它可以直接用作模型。

+0

其實我嘗試過** QVariantList **,但是我無法插入'ClassB'對象。請給我舉個例子嗎? – pra7

+1

我不知道如何「可編輯」這樣的隱式轉換列表。我建議你不要打擾。如果你想從C++插入,你顯然會插入一個'QVariant :: fromValue(objPtr)',因爲它只是一個'QList ',你插入的方式與你插入任何'QList'相同。 – dtech

+0

謝謝,我現在能夠通過。之後,我可以使用'[]'操作符訪問?因爲我喜歡這個'var res = classAObj.objDetails',後來我試圖打印它,像這樣'res [0]'...並且得到相同的錯誤.. – pra7