QML - 捕获子对象的所有UI事件

时间:2017-05-15 21:56:38

标签: qt events qml listener

在我的QML项目中,我需要一个对象来捕获其子对象的所有UI事件。因此,如果它的任何一个孩子注册了一个点击或什么,父对象需要知道它。这里的问题是所有子对象都是预定义的类,如MyButton或MyComboBox。这些类都定义了无法覆盖的MouseAreas和onClicked()函数。因此,我需要父对象捕获其子项的所有事件,而不修改子项的MouseAreas。请让我知道实现这一目标的最佳方法。

2 个答案:

答案 0 :(得分:3)

您可以抓取对象树,将函数连接到每个signup - 信号。

为此,我们需要三个部分:

  • 应连接的信号
  • 执行抓取的功能
  • 一个函数,它创建另一个函数来使用自定义参数调用信号。

我选择了,我的信号必须有参数:onClickedsender。发件人是我点击的对象,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.definePropertyconnect - 处理程序。

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)
     }
}