QML - 带有默认参数的信号
Posted
技术标签:
【中文标题】QML - 带有默认参数的信号【英文标题】:QML - Signal with Default Arguments 【发布时间】:2020-12-18 05:40:29 【问题描述】:我看到下面的信号声明给出了一个语法错误:
signal mySignal(int x, int y = 0)
有没有办法用默认参数定义信号?如果不是,您会建议什么解决方法?
我可以定义两个不同的信号,但这并不理想,因为我正在加载具有此信号的组件(通过具有与信号定义相同的基本组件),并且希望保持我的信号处理程序代码多态。否则我想我必须添加一个属性来确定信号签名,以便我可以处理我的 Connections
类中的所有签名:
Connections
target: myLoader.item
function onMySignal1stSignature(x)
if (myLoader.item.signalType === 1) ...
function onMySignal2ndSignature(x, y)
if (myLoader.item.signalType === 2) ...
这显然是丑陋和可怕的。
【问题讨论】:
看看这个***.com/a/44128406/3365136 @Farshid616 这个问题是针对功能的,而不是针对信号的。您不能调用参数数量少于声明的信号。并且 ECMAScript 7 语法在信号声明中使用时会引发语法错误。 【参考方案1】:你可以用两个参数定义一个信号,但仍然只传递一个。
signal mySignal(int x, int y)
function someFunction()
mySignal(3);
然后在您的插槽中,只需检查undefined
:
Connections
target: myLoader.item
function onMySignal(x, y)
if (y === undefined)
y = 0;
...
更新:
对不起,我的错。您不能跳过信号中的参数,但可以跳过 javascript 函数的参数。因此,您可以将信号包装在函数调用中,如下所示:
signal mySignal(int x, int y)
function emitMySignal(x, y)
if (y === undefined)
y = 0;
mySignal(x, y)
这样称呼它有效。 (我试过了!):
emitMySignal(3);
【讨论】:
您是否尝试运行您的示例?尝试调用参数数量少于声明的信号时,我得到“错误:参数不足”。 (Qt 5.15.2) 抱歉,我假设它适用于信号。它确实适用于功能。所以我会编辑我的答案。 包装器是一个很好的解决方法,谢谢。我唯一的修改是使用包装器的默认函数参数。 创建了一个错误报告。对于发现此问题的人,您可以检查当前状态:bugreports.qt.io/browse/QTBUG-89604以上是关于QML - 带有默认参数的信号的主要内容,如果未能解决你的问题,请参考以下文章