如何从一个QML文件向另一个QML文件发送信号

16

我找不到一种方法来在一个QML文件中与另一个文件通信。我知道有许多方法可以在QML和C++之间发送信号,但是我所有关于两个不同的QML文件之间信号的研究都失败了。 所以,如果有人能告诉我如何解决这个问题,我将很高兴。

首先,以下是一个简化的示例,以更好地理解问题...

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

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

  Button
  {
       id: idMyButton1
       onClicked:
       {
            idMyRec1.mySignalFromQML1();      //to send the signal
       }
   }
}
第二个看起来是这样的:
//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!";
         }
      }
}

当点击这个按钮时,它应该改变我第二个QML中的文本为“Good Bye World!”,但是它没有起作用……是否还有其他方法可以从QML发送信号到另一个QML?!或者我做错了什么吗?

2个回答

21

你不需要在 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
    }
  }

然后您创建对象:

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

Rect2 {
  id: r2
}

然而,还有其他方法可以建立连接,但是连接发生在对象实例之间,而不是qml文件之间。这些对象也不必在同一个qml文件中,但最初对于简单的事情,它们很少会在不同的文件中。


抱歉,到目前为止这对我没有起作用... 我在一个全新的项目中尝试了你的示例来进行测试,但我的编译器无法处理你所称之为“对象”的Rect1{...}和Rect2{...}我做错了什么?抱歉...我是qml编程的新手...但感谢你的帮助! - P.Ross
你需要将 Rect1.qmlRect2.qml 作为项目的一部分。然后你可以将它们用作 QML 类型。你真的需要退一步,从头开始学习 QML。一个好的起点是 https://qmlbook.github.io/。 - dtech
1
啊,好的...谢谢!我真是太蠢了!我以前做过这个很多次,但是忘记在新项目中重命名我的 QML 文件了... 但你说得对...我必须学习更多关于 QML 的知识...还有很长的路要走! 感谢你提供的链接! - P.Ross

11

对我而言,以下的方法能在一个qml文件中使用Connectionssignal

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

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

我喜欢这个例子。但在我看来,Connections 中的“target”属性很令人困惑,应该真正意义上的是“源”或“发起者”。我们说“item”是信号源,而 item1 和 item2 则为该信号提供插槽或目标。 - Rich von Lehe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接