QML在模块内通信是通过id来访问控件或者属性,但是不同的模块间该如何实现相互通信呢?如果两个模块之间有父子关系是可以通过传递属性的方式给下级模块传递信息。但是如果想在下级模块想控制上级模块的属性或者动作就需要用到另一种方式就是信号的方式。
在这个例子中,我们假设有两个QML模块,一个称为"发送信号的模块",另一个称为"接收信号的模块",它们位于共同的父级组件内。
首先,我们在"发送信号的模块"中定义一个信号restChanged()
,并在需要发送信号的地方发射该信号。然后,在"接收信号的模块"的 Component.onCompleted
中,我们将信号与一个处理函数(槽函数)连接起来,以便在接收到信号时执行相应的操作。
以下是扩展后的示例代码:
// 发送信号的模块
Item {
id: sendingModule
// 定义信号
signal restChanged();
// 在需要的地方发射信号
function emitRestChangedSignal() {
restChanged();
}
// 调用函数来发射信号
Component.onCompleted: {
emitRestChangedSignal();
}
}
// 接收信号的模块
Item {
id: receivingModule
// 连接信号与处理函数
Component.onCompleted: {
// 将发送信号的模块对象传递给接收信号的模块,并连接信号与处理函数
sendingModule.restChanged.connect(handleRestChanged);
}
// 处理信号的槽函数
function handleRestChanged() {
console.log("Received restChanged signal");
// 在这里执行接收到信号后的操作
}
}
在这个例子中,sendingModule
发射了一个名为 restChanged
的信号,然后 receivingModule
在 Component.onCompleted
中将该信号与名为 handleRestChanged
的处理函数连接起来。当 restChanged
信号被发射时,handleRestChanged
函数会被调用,并在控制台中输出一条消息