在 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()?

PyQt 5.6:连接到 DBus 信号挂起

Qt 5.7 - QWebEngineView - 将 HTML 按钮单击事件连接到 C++/Qt 插槽

如何在C中将char连接到char *?

QXcbConnection:使用 Qt5 远程调试程序时无法连接到显示器

qt5.7 中的信号和槽 - QWebEnginePage