在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,若大神有空,帮忙看看,谢啦


Log in to reply
 

走马观花

最近的回复

  • 萌梦 男孩,女孩,和蛋

    menghome.png

    read more
  • 设计模式-工厂模式

    使用qt/qml来演示设计模式效果,便于学习理解

    1)定义创建对象的接口,封装对象的创建
    2)使具体化类的工作延迟到工厂子类中

    bg.png
    image.png

    1. 工厂类

    createProduct使用了参数来选择要创建哪个产品

    #ifndef FACTORY_H #define FACTORY_H #include <QObject> class Product; class QString; class Factory: public QObject { Q_OBJECT public: virtual ~Factory() = 0; virtual Product* createProduct(QString type) = 0; protected: Factory(); }; class ConcreteFactory: public Factory { Q_OBJECT public: ~ConcreteFactory(); ConcreteFactory(); public slots: Product* createProduct(QString type); }; #endif // FACTORY_H #include "factory.h" #include "product.h" #include <QtQml/qqml.h> Factory::~Factory() { } Factory::Factory() { qmlRegisterType<Product>("Product", 1, 0, "Product"); } ConcreteFactory::~ConcreteFactory() { } ConcreteFactory::ConcreteFactory() { } Product *ConcreteFactory::createProduct(QString type) { if(type == "boy") return static_cast<Product *>(new ConcreteProduct1()); else if(type == "girl") return static_cast<Product *>(new ConcreteProduct2()); return static_cast<Product *>(new ConcreteProduct1()); } 2 产品类

    一个产品是萌梦男,一个产品是萌梦女

    #ifndef PRODUCT_H #define PRODUCT_H #include <QObject> class Product: public QObject { Q_OBJECT public: virtual ~Product() = 0; Q_PROPERTY(QString icon READ icon NOTIFY iconChanged) QString m_icon; QString icon() const { return m_icon; } signals: void iconChanged(QString icon); protected: Product(); signals: public slots: }; class ConcreteProduct1: public Product { Q_OBJECT public: ~ConcreteProduct1(); ConcreteProduct1(); }; class ConcreteProduct2: public Product { Q_OBJECT public: ~ConcreteProduct2(); ConcreteProduct2(); }; #endif // PRODUCT_H #include "product.h" Product::~Product() { } Product::Product() { } ConcreteProduct1::~ConcreteProduct1() { } ConcreteProduct1::ConcreteProduct1() { m_icon = "qrc:/images/boy.png"; } ConcreteProduct2::~ConcreteProduct2() { } ConcreteProduct2::ConcreteProduct2() { m_icon = "qrc:/images/girl.png"; } 3. main.qml

    使用timer,canvas,listview等实现一个自动化生产的动画效果

    源代码

    Fork me on Gitee

    read more
  • blender建模 章鱼
    捕获2.PNG 😵

    read more

关注我们

微博
QQ群