如何使用带有QML插槽的自定义Qt C ++类型?

时间:2016-09-09 22:04:34

标签: c++ qt qml

我想在QML插槽中使用我在QML中注册的C ++类型作为参数。所以我已经有了C ++信号,它有QString类型参数:

emit newMessage(myString);

和QML插槽:

onNewMessage: {
    console.log(myString);
}

现在我想将在QML中注册的C ++类型作为此插槽的参数传递。 我找到similar question,但我不明白我怎么能用这个反之亦然。任何帮助都会有用。

1 个答案:

答案 0 :(得分:0)

所以让我们假设您希望通过信号/插槽设置将QObject派生文件从C ++传递到QML。

  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); }
  };

如果您有一个名为MyClass的C ++类型,它是一个基于QObject的类型,并且您成功完成了

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

然后在QML中你所要做的就是:

  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)

               } 
      }
  }

摘要:

你可以发送任何QObject派生的对象,只要它在QML引擎中注册为实际对象,你只需将其视为QML中的任何其他类型

希望这有帮助