Qt5信号/插槽语法w /过载信号&拉姆达

时间:2015-07-01 14:43:46

标签: c++ lambda qt5

我使用信号/插槽连接的新语法。它对我来说很好,除非我试图连接一个超载的信号。

explain

不同之处在于currentIndexChanged是重载的(int和const QString& types),但editTextChanged不是。非过载信号连接良好。超负荷的人不会。我想我错过了什么?使用GCC 4.9.1,我得到的错误是

MyClass : public QWidget
{
    Q_OBJECT
public:
    void setup()
    {
        QComboBox* myBox = new QComboBox( this );
        // add stuff
        connect( myBox, &QComboBox::currentIndexChanged, [=]( int ix ) { emit( changedIndex( ix ) ); } ); // no dice
        connect( myBox, &QComboBox::editTextChanged, [=]( const QString& str ) { emit( textChanged( str ) ); } ); // this compiles
    }
private:

signals:
    void changedIndex( int );
    void textChanged( const QString& );
};

1 个答案:

答案 0 :(得分:10)

您需要通过以下方式显式选择所需的重载:

connect(myBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), [=]( int ix ) { emit( changedIndex( ix ) ); });

从Qt 5.7开始,提供了方便宏qOverload来隐藏投射细节:

connect(myBox, qOverload<int>(&QComboBox::currentIndexChanged), [=]( int ix ) { emit( changedIndex( ix ) );