Выяснение, какой пункт меню был запущен в Qt

В приложении Qt у меня есть куча автоматически созданных QActions (пунктов меню), которые я добавляю в меню в строке меню. Каждый открывает другой файл. Я хотел бы подключить их все к одному слоту, чтобы не писать один и тот же код много раз. Из этого слота, однако, как я могу определить, какой из QActions был вызван?

(Пример: В Cocoa я сделал бы это с параметром отправителя в селекторе действий.)

Спасибо!

Ответы

Ответ 1

У вас есть два варианта:

  • Вызовите sender() в слот, который вернет действие, вызвавшее сигнал.
  • Используйте QSignalMapper.

Ответ 2

Я бы подключился к сигналу "запущенный" QMenu, а не каждому QAction. Это дает вам QAction, который был нажат как первый параметр.

void MyObject::menuSelection(QAction* action)
{
  qDebug() << "Triggered: " << action->text();
} 

void MyObject::showMenu(QPoint menuPos)
{
  QMenu menu;
  menu.addAction( "File A" );
  menu.addAction( "File B" );
  menu.addAction( "File C" );
  connect(&menu, SIGNAL(triggered(QAction*)), this, SLOT(menuSelection(QAction*)));
  menu.exec(menuPos);
}

Ответ 3

В Qt у вас также есть доступ к отправителю: QObject::sender.