gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:46:55 25 4
gpt4 key购买 nike

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

最佳答案

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

为此我们需要三个部分:

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

我选择,我的信号必须有参数:senderarguments 。发件人是我单击的对象,并且 argumentsclicked 的参数-被点击对象的信号。 QtQuick.Controls 2.x Button 为空s 并包含 mouse 的一个条目 ( MouseArea ) s。

signal somethingWasClicked(var sender, var arguments)

由于该信号与 clicked 的签名不同对于每个可点击的对象,我们无法将其直接连接到该信号。我们需要一个中间函数来为我们调用信号,在其范围内具有所需的参数并且没有参数。我们需要为我们监视的每个对象动态构建它。

function createSpyFunction(object) {
return function() { somethingWasClicked(object, arguments) }
}

最后是抓取功能。我们需要将我们创建的函数存储在某个地方。为此,我利用了以下事实:所有 QtObject s 在某种意义上是 JS 对象,所以我可以使用 Object.defineProperty to dynamically add JS-properties给他们。我可以在这里存储我们的函数,而不需要修改组件本身的源代码。创建这个函数后,我 connectonClicked -处理程序。

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 ,并抓取新添加的对象。那里的过程几乎相似,因此这留给用户作为练习,或者可能会遇到新问题。

关于qt - QML - 捕获子对象的所有 UI 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43989428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com