Слот как параметр в лямбда-функции в C ++ / Qt - PullRequest
2 голосов
/ 22 мая 2019

У меня есть лямбда-метод, который я хотел бы получить в качестве параметра слотвызывая createShortcuts.Скорее что-то вроде

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

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

Но я не смог найти правильный синтаксис для вызова слота.

1 Ответ

2 голосов
/ 22 мая 2019

Это должно работать, вам просто не хватает имени указателя функции.

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

Edit: Приведенное выше решение работает только в том случае, если объявлено 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 );
...