Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Solved Signals passing pointer

    QML and Qt Quick
    2
    4
    1892
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      mondo last edited by mondo

      I wish to pass a pointer by singals and slots.

      Connections{
                      target: device
                      onImageBufCreated:{
                          real_time_image.initImageBuf(pFrameBuf)
                      }
                  }
      
      

      The device issues a ImagebufCreated signals which carries a pointer to a buff. pFrame is a char* pointer.

      The real_time_image component catch the signal to do somthing.

      But this gives a runtime error:
      qrc:/qml/main.qml:149: Error: Unknown method parameter type: char*

      When I change the pointer pFrame to int, the connection works fine. I also experimented with QObject::Connect, signals can carry pointers, but when it is defined in QML Connection type, the engine does not recognize it.

      Is it a bug or is there a better practice than passing pointers?

      Cheers

      Update: Currently, I walk around this problem by reinterpret char* to int, passing it, then reinterpret it back. It works but Soooooo ugly.

      1 Reply Last reply Reply Quote 0
      • 6thC
        6thC last edited by

        @mondo said in Signals passing pointer:

        I expect you need to register your c++ type that gets passed to your QML engine (pFrameBuf)
        http://doc.qt.io/qt-5/qtqml-cppintegration-definetypes.html#registering-non-instantiable-types

        However, have you seen :
        http://doc.qt.io/qt-5/qtqml-cppintegration-data.html#qbytearray-to-javascript-arraybuffer
        http://doc.qt.io/qt-5/qbuffer.html

        You might find it easier to not use char*'s.

        M 1 Reply Last reply Reply Quote 2
        • M
          mondo @6thC last edited by mondo

          @6thC
          The idea to register any pointer type I use is still not that elegant.

          QbyteArray solves my problem here, it can be passed in signals.
          I'll just need some time to adapt to qt native types.

          Thanks for you help mate.

          1 Reply Last reply Reply Quote 2
          • 6thC
            6thC last edited by

            Just have to register the class type (not as a pointer).

            It just needs know about your class type and what to refer to it as.

            // register T
            qmlRegisterUncreatableType<ClassT>("MyClassT"    ,1,0,"MyClassT", "");
            
            // set QML instance to context
            context->setContextProperty(QLatin1Literal("MyClassTIstnaceNamedCpp"), &myCppUncreatableObject);
            

            // QML

            function something(){
              ...
              // call cpp something
              MyClassTIstnaceNamedCpp.something();
            }
            // QML Connection also:
            Connections {
              target: MyClassTIstnaceNamedCpp;
              onSomething: {
                print("cpp something happened");
              }
            }
            

            Sorry it's not all complete but ... hopefully gives you a peek. It's probably possible much easier.

            You can also pass pointers to objects and have QML dynamically create registered CPP class instances - my example has cpp instanced objects and named context... sorry if I'm not explaining very well but I am actually procrastinating myself... on a tight deadline. I shouldn't! Anyhow, good luck.

            1 Reply Last reply Reply Quote 0
            • First post
              Last post