首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++ / Qt中作为lambda函数中参数的槽

在C++ / Qt中作为lambda函数中参数的槽
EN

Stack Overflow用户
提问于 2019-05-22 23:32:26
回答 1查看 110关注 0票数 2

我有一个lambda方法,我希望接收一个插槽作为参数

我的结论是:

代码语言:javascript
复制
  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槽。而是像这样

代码语言:javascript
复制
  auto createShortcuts = [ = ]( const QString &sequence, void ( MyObject::* )() )
  {
    QShortcut *sc = new QShortcut( QKeySequence( sequence ), this );
    connect( sc, &QShortcut::activated, mMyObject, ??? );
  };

  createShortcuts( QStringLiteral( "whatever" ), &MyObject::mySlot );

但是我找不到合适的语法来调用这个槽。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-22 23:40:18

这应该是有效的,你只是遗漏了函数指针的名称。

代码语言:javascript
复制
  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时才有效,下面的方法更安全。

代码语言:javascript
复制
  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 );
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56260361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档