在 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的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Qt 中将插槽连接到信号 QProcess::started()?
Qt 5.7 - QWebEngineView - 将 HTML 按钮单击事件连接到 C++/Qt 插槽