我找不到从一个qml文件到另一个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?!或者我做错了什么?
答案 0 :(得分:3)
你不在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文件中,但最初对于简单的事情,它们很少会出现在不同的文件中。
答案 1 :(得分:0)
对我来说,这可以在一个qml文件中与Connections
和signal
一起使用,如下所示:
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
的项目也可以位于不同的文件中。