How to create new instance of a Q_GADGET struct in QML?

前端 未结 1 377
清酒与你
清酒与你 2021-01-13 03:36

I can emit signals with structs tagged with Q_GADGET from C++ to QML.

Is it possible send such a struct from QML to a C++ slot? My code fails on the first step: crea

1条回答
  •  执笔经年
    2021-01-13 04:00

    You don't create Q_GADGETs in QML, QML objects need to be QObject derived, and are not created via new - that's for JS objects only. Gadgets just generate meta data so that you can access their members and such from QML and pass around, that's about it.

    Is it possible send such a struct from QML to a C++ slot?

    It is possible to send, but it would not be created in QML. It could be returned to QML from a C++ function or be exposed as a property of some object.

    struct Test {
        Q_GADGET
        Q_PROPERTY(int test MEMBER test)
      public:
        Test() : test(qrand()) {}
        int test;
        Q_SLOT void foo() { qDebug() << "foo"; }
    };
    
    class F : public QObject { // factory exposed as context property F
        Q_OBJECT
      public slots:
        Test create() { return Test(); }
        void use(Test t) { qDebug() << t.test; }
    };
    
    
        // from QML
        property var tt: F.create()
    
        Component.onCompleted: {
          F.use(F.create()) // works
          var t = F.create()
          console.log(t.test) // works
          F.use(t) // works
          console.log(tt.test) // works
          F.use(tt) // works
          tt.test = 555
          F.use(tt) // works
          t.test = 666
          F.use(t) // works
          t.foo() // works
        }
    

    0 讨论(0)
提交回复
热议问题