如何从一个qml向另一个qml发送信号

P.R*_*oss 3 qt qml

我找不到一种从一个qml文件与另一个qml文件进行通信的方法。我知道有很多方法可以将信号从qml发送到C ++插槽并反向传输,但是我对两个不同qml文件之间的信号的所有研究都失败了。因此,如果有人可以告诉我如何解决这个问题,我将感到非常高兴。

首先是一个抽象的示例,以更好地理解问题。

基本的第一个QML看起来像这样:

//MyQML1.qml
Rectangle
{    
     id: idMyRec1
     signal mySignalFromQML1()

  Button
  {
       id: idMyButton1
       onClicked:
       {
            idMyRec1.mySignalFromQML1();      //to send the signal
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

第二个看起来像这样:

//MyQML2.qml
Rectangle
{
    id: idMyRec2

    Text{
         id: idMyText2
         text: "Hello World!"

         onMySignalFromQML1:       //to receive the signal from the other qml
         {                  
             idMyText2.text = "Good Bye World!";
         }
      }
}
Run Code Online (Sandbox Code Playgroud)

因此,此按钮应将我的第二个QML中的文本更改为“ Good Bye World!”。当单击时...但这不起作用...还有其他方法可以将信号从QML发送到另一个QML吗?还是我做错了什么?

dte*_*ech 8

您不会在qml文件之间进行通信,QML文件只是一个原型,而是在对象实例之间进行通信。

  // Rect1.qml
  Rectangle {
    id: rect1
    signal mySignal
    Button {
      onClicked: rect1.mySignal()
    }
  }

  // Rect2.qml
  Rectangle { // Rect1.qml
    property alias text: txt.text
    Text {
      id: txt
    }
  }
Run Code Online (Sandbox Code Playgroud)

然后创建对象:

Rect1 {
  onMySignal: r2.text = "Goodbye world!"
}

Rect2 {
  id: r2
}
Run Code Online (Sandbox Code Playgroud)

还有其他建立连接的方法,但是,连接发生在对象实例之间,而不是qml文件之间。这些对象也不必位于相同的qml文件中,但是起初出于简单的考虑,它们很少会位于不同的文件中。


Man*_*ger 7

对我来说,这一点也适用Connections,并signal在一个QML文件如下:

import QtQuick 2.4
import QtQuick.Controls 1.2

Item {
    id: item
    width: 200
    height: 200
    signal sendMessage(string msg, int compId)

    Button {
        text: "SendMessage"
        onClicked: sendMessage("hello",1)
    }

    Item {
        id: item1
        Connections {
            target: item
            onSendMessage: if(compId==1) { console.log("Hello by Comp 1") }
        }
    }

    Item {
        id: item2
        Connections {
            target: item
            onSendMessage: if(compId==2) { console.log("Hello by Comp 2") }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,带有 的项目Connections也可以在不同的文件中。