我有一个lambda方法,我希望接收一个插槽作为参数
我的结论是:
auto createShortcuts = [ = ]( const QString &sequence, const std::function < void () > &slot )
{
QShortcut *sc = new QShortcut( QKeySequence( sequence ), this );
connect( sc, &QShortcut::activated, mMyObject, slot );
};
createShortcuts( QStringLiteral( "whatever" ), [=](){mMyObject->mySlot();} );但我更希望在调用createShortcuts时避免使用lambda槽。而是像这样
auto createShortcuts = [ = ]( const QString &sequence, void ( MyObject::* )() )
{
QShortcut *sc = new QShortcut( QKeySequence( sequence ), this );
connect( sc, &QShortcut::activated, mMyObject, ??? );
};
createShortcuts( QStringLiteral( "whatever" ), &MyObject::mySlot );但是我找不到合适的语法来调用这个槽。
发布于 2019-05-22 23:40:18
这应该是有效的,你只是遗漏了函数指针的名称。
auto createShortcuts = [ = ]( const QString &sequence, void ( MyObject::* myFunc )() )
{
QShortcut *sc = new QShortcut( QKeySequence( sequence ), this );
connect( sc, &QShortcut::activated, mMyObject, myFunc);
};
createShortcuts( QStringLiteral( "whatever" ), &MyObject::mySlot );编辑:上面的解决方案只有在声明了createShortcuts的相同作用域中声明mMyObject时才有效,下面的方法更安全。
auto createShortcuts = [ = ]( const QString &sequence, const MyObject* mMyObject, void ( MyObject::* myFunc )() )
{
QShortcut *sc = new QShortcut( QKeySequence( sequence ), this );
connect( sc, &QShortcut::activated, mMyObject, myFunc);
};
auto obj = new MyObject();
createShortcuts( QStringLiteral( "whatever" ), obj, &MyObject::mySlot );https://stackoverflow.com/questions/56260361
复制相似问题