首页 文章

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

提问于
浏览
2

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

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中):

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

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

1 回答

  • 2

    sim642提供的link也声明了新的连接语法"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); });
    

    这用[this]替换[=](使lambda能够通过值捕获范围内的所有自动变量),减少lambda的范围和出错的可能性 .

相关问题