Qt5 Signal/Slot 带重载信号和 lambda 的语法
Qt5 Signal/Slot syntax w/ overloaded signal & lambda
我正在为 Signal/Slot 连接使用新语法。它对我来说工作正常,除非我尝试连接过载的信号。
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& );
};
区别在于 currentIndexChanged 被重载(int 和 const QString& 类型)但 editTextChanged 没有。非过载信号连接正常。超载的没有。我想我错过了什么?使用 GCC 4.9.1,我得到的错误是
no matching function for call to ‘MyClass::connect(QComboBox*&, <unresolved overloaded function type>, MyClass::setup()::<lambda()>)’
您需要通过如下方式显式select您想要的重载:
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 ) );
我正在为 Signal/Slot 连接使用新语法。它对我来说工作正常,除非我尝试连接过载的信号。
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& );
};
区别在于 currentIndexChanged 被重载(int 和 const QString& 类型)但 editTextChanged 没有。非过载信号连接正常。超载的没有。我想我错过了什么?使用 GCC 4.9.1,我得到的错误是
no matching function for call to ‘MyClass::connect(QComboBox*&, <unresolved overloaded function type>, MyClass::setup()::<lambda()>)’
您需要通过如下方式显式select您想要的重载:
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 ) );