如何将信号从一个 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.qml
和Rect2.qml
作为项目的一部分。然后您可以将它们用作 QML 类型。你真的需要退后一步,从头开始学习 QML。一个好的起点是qmlbook.github.io
啊,好的……谢谢!愚蠢的我!我以前做过很多次,但是忘记在新项目中重命名我的 qml 文件...但是您是对的...我必须了解有关 QML 的更多信息...还有很长的路要走!谢谢你的链接!【参考方案2】:
对我来说,这适用于 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")
当然Connections
的项目也可以在不同的文件中。
【讨论】:
我喜欢这个例子。不过,在我看来,Connections 中的“目标”属性令人困惑,实际上应该是“源”或“发起者”。我们说“item”是信号源,item1 和 item2 分别为该信号提供插槽或目的地。以上是关于如何将信号从一个 qml 发送到另一个的主要内容,如果未能解决你的问题,请参考以下文章
QThread如何从其自己的线程发送一个带有枚举作为QML消耗参数的信号?