如何在具有默认参数的插槽上使用 Qt5 connect()
How can I use Qt5 connect() on a slot with default parameters
我有一些代码看起来像这样:
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's new signal/slot syntax(并删除宏)。如果我将 connect() 更改为:
connect(this, &MyClass::SetValue, this, &MyClass::OnSetValue);
我得到(在 Visual Studio 2013 年):
error C2338: The slot requires more arguments than the signal provides
我可以创建一个调用 OnSetValue() 并允许设置默认参数的中间函数,但这似乎是一种代码浪费。解决这个问题的更好方法是什么?
提供的 link that sim642 还声明了新的连接语法 "can be used with c+11 lambda expressions"。对于上面的示例,我能够使用:
connect(this, &MyClass::SetValue, [=](float value) { OnSetValue(value); });
这比添加中间函数稍微复杂一些,但代码更少,并且仍然提供编译时检查。
Igor Tandetnik 上面提供了一个更好的版本:
connect(this, &MyClass::SetValue, [this](float value){ OnSetValue(value); });
这将 [=](使 lambda 能够按值捕获范围内的所有自动变量)替换为 [this],减少了 lambda 的范围和出错的可能性。
我有一些代码看起来像这样:
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's new signal/slot syntax(并删除宏)。如果我将 connect() 更改为:
connect(this, &MyClass::SetValue, this, &MyClass::OnSetValue);
我得到(在 Visual Studio 2013 年):
error C2338: The slot requires more arguments than the signal provides
我可以创建一个调用 OnSetValue() 并允许设置默认参数的中间函数,但这似乎是一种代码浪费。解决这个问题的更好方法是什么?
提供的 link that sim642 还声明了新的连接语法 "can be used with c+11 lambda expressions"。对于上面的示例,我能够使用:
connect(this, &MyClass::SetValue, [=](float value) { OnSetValue(value); });
这比添加中间函数稍微复杂一些,但代码更少,并且仍然提供编译时检查。
Igor Tandetnik 上面提供了一个更好的版本:
connect(this, &MyClass::SetValue, [this](float value){ OnSetValue(value); });
这将 [=](使 lambda 能够按值捕获范围内的所有自动变量)替换为 [this],减少了 lambda 的范围和出错的可能性。