在c++里面创建的qml对象,获取属性的问题



  • 请教big god
    我有一个qml文件
    QtObject {
    property var ary: [{"key": "aa"}];
    }

    我在c++类CCreateQMLInCPP 里创建了该对象,然后把这个对象注册到qml的context里面去了
    QQmlContext* context = engine.rootContext();
    CCreateQMLInCPP qmlModeldata;
    context->setContextProperty("ModelDataQML", qmlModeldata.getQMLObj());

    ,qml的界面去用的时候发现了这样的问题
    Window {
    visible: true
    ListModel{
    id: list;
    }
    Component.onCompleted: {
    var aryTmp = ModelDataQML.ary;
    list.append(aryTmp);
    console.log(list.get(0).key); // 能正常显示aa
    console.log(aryTmp[0].key); // 为啥显示undefined???
    }
    }



  • @fish 在 在c++里面创建的qml对象,获取属性的问题 中说:

    CCreateQMLInCPP

    在QML不能通过下标访问。会被默认变成QListModel。你输出一下

    console.log( typeof ( aryTmp ) )
    

    看看?



  • console.log( typeof ( aryTmp ) ) 输出是object



  • @fish

    CCreateQMLInCPP 的结构是怎么样的?

    qmlModeldata.getQMLObj() 在c++ 中是什么数据类型?

    qml 代码中 ModelDataQML.ary 在 c++ 中对应的是什么类型?

    这些如果能提供出来的话。可以帮你更好的解决问题。

    此外,可以在 QML 代码中通过 [Number] 下标访问的类型,一般是 QJSValue (并且为 js 数组),QJsonValue (并且可以通过 QJsonValue::toArray 进行转换),QJsonArrayQList<T> 这些类型。



  • CCreateQMLInCPP 这个类很简单 CCreateQMLInCPP.cpp:
    #include "CCreateQMLInCPP.h"

    CCreateQMLInCPP::CCreateQMLInCPP(QObject *parent) : QObject(parent),m_pObj(NULL),m_pComponent(NULL)
    {
    createQML();
    }

    CCreateQMLInCPP::~CCreateQMLInCPP()
    {
    if(m_pObj != NULL)
    {
    delete m_pObj;
    m_pObj = NULL;
    }
    if(m_pComponent != NULL)
    {
    delete m_pComponent;
    m_pComponent = NULL;
    }
    }

    void CCreateQMLInCPP::createQML()
    {
    m_pComponent = new QQmlComponent(&m_engine, QUrl(QStringLiteral("qrc:/ModelData.qml")));
    m_pObj = m_pComponent->create();
    }

    QObject* CCreateQMLInCPP::getQMLObj()
    {
    return m_pObj;
    }

    CCreateQMLInCPP.h文件:
    #ifndef CCREATEQMLINCPP_H
    #define CCREATEQMLINCPP_H

    #include <QObject>
    #include <QQmlEngine>
    #include <QMetaObject>
    #include <QQmlComponent>

    class CCreateQMLInCPP : public QObject
    {
    Q_OBJECT
    public:
    explicit CCreateQMLInCPP(QObject *parent = 0);
    ~CCreateQMLInCPP();

    void createQML();
    
    QObject* getQMLObj();
    

    signals:

    public slots:

    private:
    QObject* m_pObj;
    QQmlComponent* m_pComponent;
    QQmlEngine m_engine;
    };

    #endif

    ModelData.qml也很简单:
    import QtQuick 2.0
    QtObject {
    property var ary: [{"key": "aa"}];
    }

    main.cpp函数:

    #include <QGuiApplication>
    #include <QQmlApplicationEngine>
    #include <QQmlContext>
    #include "CCreateQMLInCPP.h"

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

    QQmlApplicationEngine engine;
    QQmlContext* context = engine.rootContext();
    CCreateQMLInCPP qmlModeldata;
    if(qmlModeldata.getQMLObj()!= NULL)
    {
        context->setContextProperty("ModelDataQML", qmlModeldata.getQMLObj());
    }
    
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    
    return app.exec();
    

    }



  • 可能看起来不太方便,我在群里上传了这个test project,若大神有空,帮忙看看,谢啦


登录后回复
 

与 萌梦社区 的连接断开,我们正在尝试重连,请耐心等待