当许多派生组件频繁使用该功能时,在“基本”组件中定义信号处理程序非常漂亮。
但是,在 QML 中,在派生组件中安装新的处理程序does not替换原来的处理程序,它只是堆叠在它的上面。由于处理程序对于每个信号来说并不是唯一的,它们只是连接,并且每个信号可以有多个连接。
一种解决方案是根本不在基本组件中提供默认处理程序,但是每次使用组件时都必须复制并粘贴处理程序。那么有没有更好的办法呢?
正如 peppe 提到的,一种解决方案是不直接安装处理程序,而是让处理程序调用可重写的函数。然而,当打算在派生组件中重用基本实现时,函数重写本身是一个混合包,而不必按照处理程序与组件继承堆栈的顺序。
我实际上想出了一个灵活但有点笨拙的解决方案。就是手动断开之前安装的handler,然后手动连接一个新的。这有两个含义:
处理程序不能是匿名表达式,它们必须作为函数实现,以便可以引用它们来断开连接。
不能使用声明性语法(onSignal: handler()
),因为这不连接到处理函数,而是连接到调用处理函数的匿名表达式。所以你无法断开连接。
所以它看起来像这样:
//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 提供一种漂亮的方法来创建“唯一”绑定(在创建新连接之前清除所有先前的连接),那就太好了。那么所有的解决方法代码就不再需要了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)