在 QT5 中将信号连接到 c++11 lambda

Posted

技术标签:

【中文标题】在 QT5 中将信号连接到 c++11 lambda【英文标题】:Connecting Signals to c++11 lambdas in QT5 【发布时间】:2017-04-20 09:42:40 【问题描述】:

我尝试将 QDoubleSpinBox 信号连接到 c++11 lamda:

QObject::connect(sbox_roughness, &QDoubleSpinBox::valueChanged,
               [=]()  std::cout << "value changed" << std::endl; );

这是给我的:

error: no matching function for call to ‘Game::connect(QDoubleSpinBox*&, <unresolved overloaded function type>, Game::initGui()::<lambda()>)’
                [=]()  std::cout << "value changed" << std::endl; );
note:   no known conversion for argument 2 from ‘<unresolved overloaded function type>’ to ‘const char*’

我试过this:

QObject::connect(sbox_roughness, static_cast<void (QDoubleSpinBox::*)(int)>(
                                   &QDoubleSpinBox::valueChanged),
               [=]()  std::cout << "value changed" << std::endl; ); 

给我:

error: no matches converting function ‘valueChanged’ to type ‘void (class QDoubleSpinBox::*)(int)’
                                    &QDoubleSpinBox::valueChanged),

我在这里错过了什么?

【问题讨论】:

【参考方案1】:
QDoubleSpinBox spinbox;

QObject::connect(&spinbox, &QDoubleSpinBox::valueChanged,
                 []()  qDebug() << "value changed"; );

这失败了,因为QDoubleSpinBox 有两个valueChanged 信号,在这里无法决定你想连接哪一个。

QObject::connect(&spinbox, static_cast<void (QDoubleSpinBox::*)(int)>(
                                  &QDoubleSpinBox::valueChanged),
                []()   qDebug() << "value changed"; );

这失败了,因为QDoubleSpinBox 没有valueChanged(int) 信号。

这将起作用:

QObject::connect(&spinbox, static_cast<void (QDoubleSpinBox::*)(double)>(
                                  &QDoubleSpinBox::valueChanged),
                []()   qDebug() << "value changed"; );

QObject::connect(&spinbox, static_cast<void (QDoubleSpinBox::*)(const QString &)>(
                                  &QDoubleSpinBox::valueChanged),
                []()   qDebug() << "value changed"; );

【讨论】:

因为它不适用于:(QDoubleSpinBox::*)(int)>( &QDoubleSpinBox::valueChanged)。很抱歉监督这个!好答案!【参考方案2】:

您遇到了参数不匹配的问题。应该是这样的:

QObject::connect(sbox_roughness, static_cast<void(QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
           [=](double val)  std::cout << "value changed" << std::endl; );

【讨论】:

您的回答已将它们更改为我的答案。

以上是关于在 QT5 中将信号连接到 c++11 lambda的主要内容,如果未能解决你的问题,请参考以下文章