如何将信号从一个 qml 发送到另一个

Posted

技术标签:

【中文标题】如何将信号从一个 qml 发送到另一个【英文标题】:How to send a signal from one qml to another 【发布时间】:2016-11-03 17:16:34 【问题描述】:

我找不到从一个 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 中的文本更改为“再见世界!”单击时...但这不起作用...还有其他方法可以将信号从 QML 发送到另一个 QML 吗?!还是我做错了什么?

【问题讨论】:

【参考方案1】:

你不会在 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 编程的新手...但感谢您的帮助! 您需要将Rect1.qmlRect2.qml 作为项目的一部分。然后您可以将它们用作 QML 类型。你真的需要退后一步,从头开始学习 QML。一个好的起点是qmlbook.github.io 啊,好的……谢谢!愚蠢的我!我以前做过很多次,但是忘记在新项目中重命名我的 qml 文件...但是您是对的...我必须了解有关 QML 的更多信息...还有很长的路要走!谢谢你的链接!【参考方案2】:

对我来说,这适用于 Connectionssignal 在一个 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") 
        
    

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

【讨论】:

我喜欢这个例子。不过,在我看来,Connections 中的“目标”属性令人困惑,实际上应该是“源”或“发起者”。我们说“item”是信号源,item1 和 item2 分别为该信号提供插槽或目的地。

以上是关于如何将信号从一个 qml 发送到另一个的主要内容,如果未能解决你的问题,请参考以下文章

从 C++ (Qt5) 向 QML 项目发送信号

QThread如何从其自己的线程发送一个带有枚举作为QML消耗参数的信号?

qml 从信号发送列表/数组

Objective-C:如何将信号从视图发送到视图控制器以更改视图?

QML 在匿名孙子之间发送信号

将对象从 c++ 发送到 qml。空闲内存呢?