在 C++/Qt 中作为 lambda 函数参数的槽
A slot as a paramater in a lambda function in C++ / Qt
我有一个 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 );
但是我找不到调用插槽的正确语法。
这应该可以,您只是缺少函数指针的名称。
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 );
编辑:
只有在声明 mMyObject
的同一范围内声明 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 );
我有一个 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 );
但是我找不到调用插槽的正确语法。
这应该可以,您只是缺少函数指针的名称。
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 );
编辑:
只有在声明 mMyObject
的同一范围内声明 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 );