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 - 带有默认参数的信号的主要内容,如果未能解决你的问题,请参考以下文章

qml 函数的默认参数给出语法错误

带有命名参数的信号

带有命名参数的 PySide2 (5.14.2) 信号

定义 QML 信号参数类型时出现意外的 Token `:'

在 qml 中捕获信号参数

在不丢失默认信号参数的情况下将额外参数传递给 PyQt 插槽