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

确定Qt中触发了哪个菜单项,qt,Qt,在Qt应用程序中,我有一组自动创建的QActions(菜单项),我将它们添加到菜单栏中的菜单中。每个打开一个不同的文件。我想将它们都连接到同一个插槽,这样就不会多次编写相同的代码。但是,从这个位置,我如何确定触发了哪些QActions (示例:在Cocoa中,我将使用动作选择器中的sender参数来执行此操作。) 谢谢 在Qt中,您还可以访问发送方:QObject::sender您有两个选项: 在插槽中调用,该插槽将返回触发信号的操作 使用 我将连接到QMenu的“触发”信号,而不是每个QAc

在Qt应用程序中,我有一组自动创建的QActions(菜单项),我将它们添加到菜单栏中的菜单中。每个打开一个不同的文件。我想将它们都连接到同一个插槽,这样就不会多次编写相同的代码。但是,从这个位置,我如何确定触发了哪些QActions

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


谢谢

在Qt中,您还可以访问发送方:
QObject::sender

您有两个选项:

  • 在插槽中调用,该插槽将返回触发信号的操作
  • 使用

我将连接到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);
}
void MyObject::菜单选择(QAction*action)
{

qDebug()如上所述,您可以通过
QObject::sender()
访问发射器句柄,这是Qt中的一个重要功能(特别是在处理n个运行时、未知类型的动态实例化对象时-可能在某个设置文件中定义).

完全正确-在您的插槽中,您可以执行以下操作:QAction*pAction=qobject_cast(sender());谢谢!qobject::sender()看起来对于我所问的情况来说已经足够了,但最好了解更通用的QSignalMapper选项。此外,您可以使用qobject::setProperty()在QAction上,将额外的每项数据传递到插槽中。
QAction::setData
可能比
QObject::setProperty
@LukášLalinský>QAction::setData可能比QObject::setProperty好。为什么这样认为?@neuronet
连接(&menu,&QMenu::triggered,this,&MyObject::menuSelection);