在我的QML项目中,我需要一个对象来捕获其子对象的所有UI事件。因此,如果它的任何一个孩子注册了一个点击或什么,父对象需要知道它。这里的问题是所有子对象都是预定义的类,如MyButton或MyComboBox。这些类都定义了无法覆盖的MouseAreas和onClicked()函数。因此,我需要父对象捕获其子项的所有事件,而不修改子项的MouseAreas。请让我知道实现这一目标的最佳方法。
答案 0 :(得分:3)
您可以抓取对象树,将函数连接到每个signup
- 信号。
为此,我们需要三个部分:
我选择了,我的信号必须有参数:onClicked
和sender
。发件人是我点击的对象,arguments
是被点击对象的arguments
- 信号的参数。 clicked
为空,并且QtQuick.Controls 2.x Button
包含一个条目(mouse
)。
MouseArea
由于此信号与每个可点击对象的signal somethingWasClicked(var sender, var arguments)
信号不同,我们无法将其直接连接到此信号。我们需要一个为我们调用信号的中间函数,在其范围内有所需的参数并且没有参数。我们需要为我们侦察的每个对象动态构建它。
clicked
最后是抓取功能。我们需要存储我们在某处创建的函数。为此,我利用了所有function createSpyFunction(object) {
return function() { somethingWasClicked(object, arguments) }
}
在某种意义上都是JS对象的事实,因此我可以对它们使用QtObject
to dynamically add JS-properties。在这里,我可以存储我们的函数,而不需要自己编写组件的源代码。
创建此函数后,我Object.defineProperty
到connect
- 处理程序。
onClicked
这个函数我终于打电话了
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
,并抓取新添加的对象。这个过程几乎相似,所以这只是作为练习留给用户,或者可能会遇到一个新问题。
答案 1 :(得分:0)
您可以尝试使用MouseArea
覆盖您的商品。在事件处理程序中,您可以检查位置并调用基础项的事件处理程序。
Item {
MyButton { id: mybutton
/* set the anchors */
}
MyMouseComboBox { id: myMouseComboBox
/* set the anchors */
}
MouseArea {
anchros.fill: parent
onClicked: {
// mouse.accepted = false
// Check whether clicked point is within mybutton
// on true, call mybutton.doSomething()
// or call mybotton.onPressed(mouse)
}
}