确定在Qt​​中触发了哪个菜单项

Geo*_*off 14 qt

在Qt应用程序中,我有一堆自动创建的QActions(菜单项),我将其添加到菜单栏中的菜单中.每个打开一个不同的文件.我想将它们全部连接到同一个插槽,以免多次写入相同的代码.但是,从那个插槽中,我如何确定触发了哪些QAction?

(示例:在Cocoa中,我使用动作选择器中的sender参数执行此操作.)

谢谢!

小智 19

我会连接到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);
}
Run Code Online (Sandbox Code Playgroud)

  • @neuronet `connect(&amp;menu, &amp;QMenu::triggered, this, &amp;MyObject::menuSelection);` (2认同)

Luk*_*ský 15

您有两种选择:

  • 此外,您可以在QAction上使用QObject :: setProperty()将额外的每项数据传递到您的插槽中. (2认同)
  • `QAction :: setData`可能比`QObject :: setProperty`更好. (2认同)

roh*_*npm 10

在Qt中,您还可以访问发件人:QObject::sender.

  • 确切地说 - 在你的插槽中你可以这样做:QAction*pAction = qobject_cast <QAction*>(sender()); (4认同)