我有一些代码看起来像这样:
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 的范围和出错的可能性。