如何在具有默认参数的插槽上使用 Qt5 connect()



我有一些代码看起来像这样:

class MyClass : public QObject
{
    Q_OBJECT
signals:
    void SetValue(float value);
public slots:
    void OnSetValue(float value, bool fromDatabase = false);
}
connect(this, SIGNAL(SetValue(float)), this, SLOT(OnSetValue(float)));

这工作正常,但我想利用 Qt5 的新信号/时隙语法(并删除宏)。如果我将连接()更改为:

connect(this, &MyClass::SetValue, this, &MyClass::OnSetValue);

我得到(在Visual Studio 2013中):

错误 C2338:插槽需要的参数多于信号提供的参数

我可以创建一个调用 OnSetValue() 并允许设置默认参数的中间函数,但这似乎是浪费代码。解决这个问题的更好方法是什么?

sim642 提供的链接还指出,新的连接语法"可以与 c+11 lambda 表达式一起使用"。对于上面的例子,我能够使用:

connect(this, &MyClass::SetValue, [=](float value) { OnSetValue(value); });

它稍微复杂一些,但比添加中间函数的代码更少,并且仍然提供编译时检查。

Igor Tandetnik在上面提供了一个更好的版本:

connect(this, &MyClass::SetValue, [this](float value){ OnSetValue(value); });

这会将 [=](使 lambda 能够按值捕获范围内的所有自动变量)替换为 [this],从而减少了 lambda 的范围和出错的可能性。

最新更新