gpt4 book ai didi

qt - 阻止 "inherited"信号处理程序执行

转载 作者:行者123 更新时间:2023-12-04 13:29:25 24 4
gpt4 key购买 nike

当该功能将被许多派生组件频繁使用时,在“基础”组件中定义信号处理程序非常巧妙。

但是,在 QML 中,在派生组件中安装新的处理程序不会替换原始处理程序,它只是堆叠在它之上。由于每个信号的处理程序并不是真正唯一的,它们只是连接,每个信号可以有多个连接。

一种解决方案是不在基础组件中提供默认处理程序,但每次使用组件时都必须复制并粘贴处理程序。那么有没有更好的方法呢?

最佳答案

正如 peppe 提到的,一种解决方案是不直接安装处理程序,而是让处理程序调用一个可以被覆盖的函数。然而,当有意在派生组件中重用基础实现时,函数覆盖本身是一个混合包,而不一定是在具有组件继承的顺序处理程序堆栈中。

我实际上想出了一个灵活但有点笨拙的解决方案。就是手动断开之前安装的handler,手动连接一个新的。这有两个含义:

  1. 处理程序不能是匿名表达式,它们必须作为函数实现,以便在断开连接时可以引用它们。

  2. 不能使用声明性语法 (onSignal: handler()) 绑定(bind)处理程序,因为它不会连接到处理程序函数,而是连接到调用处理程序的匿名表达式功能。所以你不能断开连接。

所以它看起来像这样:

//BaseComp.qml
QtObject {
signal sig(int i)
function baseHandler(i) {...}
Component.onCompleted: sig.connect(baseHandler)
}

//DerivedComp.qml
BaseComp {
function derivedHandler(i) {...}
Component.onCompleted: {
sig.disconnect(baseHandler)
sig.connect(derivedHandler)
}
}

基本模式是断开每个覆盖它的派生组件中的前一个基本处理程序。通过这种方式,如果需要,您可以从派生组件访问基本处理程序,如果只有一个被覆盖的处理程序函数,则由于在QML(将有两个同名函数作为对象的成员,但它们都将引用派生组件覆盖)。

如果 QML 提供一种漂亮的方法来创建“唯一”绑定(bind),那就太好了——在创建新连接之前清除所有以前的连接。这样就不需要所有这些解决方法代码了。

关于qt - 阻止 "inherited"信号处理程序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34948874/

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