【问题标题】:A slot as a paramater in a lambda function in C++ / Qt在 C++/Qt 的 lambda 函数中作为参数的槽
【发布时间】:2019-10-09 03:37:29
【问题描述】:

我有一个 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 );

但我找不到调用插槽的正确语法。

【问题讨论】:

  • 捕捉你需要的东西

标签: c++ qt c++11 lambda slot


【解决方案1】:

这应该可以,只是缺少函数指针的名称。

  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 被声明在同一范围内时才有效 createShortcuts 被声明,下面更安全。

  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 );

【讨论】:

  • 该对象已经存在于该问题的上下文中(请参阅mMyObject),但 +1 表示以这种方式添加它以使未来的读者明白。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 2013-11-12
  • 1970-01-01
相关资源
最近更新 更多