【问题标题】:Connecting Signals to c++11 lambdas in QT5在 QT5 中将信号连接到 c++11 lambda
【发布时间】: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),

我在这里错过了什么?

【问题讨论】:

    标签: c++ qt c++11


    【解决方案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; });
    

    【讨论】:

    • 您的回答已将它们更改为我的答案。
    猜你喜欢
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2020-09-20
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2013-09-21
    相关资源
    最近更新 更多