简体   繁体   中英

How to use a custom Qt C++ type with a QML slot?

I want to use my C++ type registered in QML as parameter in QML slot. So I already have C++ signal which has QString type parameter:

emit newMessage(myString);

and QML slot:

onNewMessage: {
    console.log(myString);
}

Now I want to pass C++ type registered in QML as parameter of this slot. I found similar question , but I don't understand how I can use this vice versa. Any help will be useful.

So Lets say you wanted to pass a QObject derived file back and forth from C++ to QML via a signal/slot setup.

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


  signals:
      void sendSignal(MyClass* anotherMyClass)
  public slots:
       void  send_signals()  {   emit sendSignal(this); }
  };

If you have a C++ type called MyClass which is a QObject-based type, and you successfully did

    qmlRegisterType<MyClass>("com.myapp", 1, 0, "MyClass");

Then In QML all you have to do is this:

  import QtQuick 2.0
  import com.myapp

  Item {
        MyClass {
              id: myInstance
              Component.OnCompleted: {
                  // connect signal to javascript function
                  myInstance.sendSignal.connect( myInstance.receiveSignal);
              }
              function receiveSignal(mySentObject) {
                      // here is your QObject sent via Signal
                      var  receivedObject = mySentObject;

                     // Now to send it back 
                    //  (will cause an endless loop)
                      myInstance.sendSignal(receivedObject);

                     //  or you could do this to perform 
                      // the same endless loop
                     receivedObject.send_signals();

                     //  or you could do this to perform 
                      // the same endless loop
                     receivedObject.sendSignal(myInstance)

               } 
      }
  }

Summary:

You can just send any QObject-derived object as long as its registered with the QML engine as the actual object, you just treat it like any other type in QML

Hope this helps

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM