您可以爬取对象树,将一个函数连接到每个onClicked-信号。
为此,我们需要三个部分:
- 应连接的信号
- 进行爬取的函数
- 创建另一个函数以使用自定义参数调用信号的函数。
我选择了,我的信号必须有参数:sender 和 arguments。 Sender 是我点击的对象,arguments 是被点击对象的clicked 信号的参数。这对于 QtQuick.Controls 2.x Buttons 是空的,并且包含一个用于 MouseAreas 的条目 (mouse)。
signal somethingWasClicked(var sender, var arguments)
由于对于每个可点击对象,此信号与clicked 的签名不同,因此我们无法将其直接连接到此信号。我们需要一个为我们调用信号的中间函数,在它的范围内有所需的参数并且没有参数。我们需要为我们监视的每个对象动态构建它。
function createSpyFunction(object) {
return function() { somethingWasClicked(object, arguments) }
}
最后是爬虫功能。我们需要将我们创建的函数存储在某个地方。为此,我利用了所有 QtObjects 在某种意义上都是 JS 对象的事实,因此我可以对它们使用 Object.defineProperty to dynamically add JS-properties。在这里我可以存储我们的函数,而不需要自己修改组件的源代码。
创建此函数后,我将connect它发送到onClicked-handler。
function crawlChildren(obj) {
if (obj.onClicked) {
Object.defineProperty(obj, '__clickedFunction', { value: createSpyFunction(obj) })
obj.onClicked.connect(obj.__clickedFunction)
}
if (obj.children) {
var i = 0
for (; i < obj.children.length; i++) {
crawlChildren(obj.children[i])
}
}
}
这个函数我终于调用了
Component.onCompleted: crawlObj(this.contentItem)
我的程序的根ApplicationWindow。
因为我只在Component.onCompleted-handler 中调用它,在此之后添加的对象不会被监视。为了改变这一点,我们还需要监视onChildrenChanged,并抓取新添加的对象。那里的过程几乎相似,所以这留给用户作为练习,或者可能会受到新问题的影响。