【问题标题】:QML - Signal with Default ArgumentsQML - 带有默认参数的信号
【发布时间】: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) ...
    }
}

这显然是丑陋和可怕的。

【问题讨论】:

  • @Farshid616 这个问题是针对功能的,而不是针对信号的。您不能调用参数数量少于声明的信号。并且 ECMAScript 7 语法在信号声明中使用时会引发语法错误。

标签: qt qml qt5 qtquick2


【解决方案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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多