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

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

我有一个 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 在同一作用域中声明 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 );

关于c++ - 在 C++/Qt 中作为 lambda 函数参数的槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56260361/

相关文章:

用普通 C 实现的 C++

c++ - 从input1查找input2中字符的位置

c++ - 如何将 Qt 信号/槽名称存储到数据结构中?

qt - 如何让一个QCombobox只显示内容(不可编辑,不可选择)

c++ - QProcess::kill() 不会在 linux 中杀死 child

c++ - 在 C++ 中为 char 数组数据类型添加的额外字符

c++ - 在 linux 中使用 boost xml_parser 如何读取和比较 windows-1251 文字?

c++ - 从字符串 vector 分配字符串

c++ - 从 move 返回的右值引用不会持久化

c++ - 使用列表而不是值范围的 uniform_int_distribution