【问题标题】:Figuring out which menu item was triggered in Qt找出 Qt 中触发了哪个菜单项
【发布时间】:2009-10-15 22:31:39
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: qt


    【解决方案1】:

    我会连接到 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);
    }
    

    【讨论】:

    • @neuronet connect(&amp;menu, &amp;QMenu::triggered, this, &amp;MyObject::menuSelection);
    【解决方案2】:

    你有两个选择:

    【讨论】:

    • 谢谢! QObject::sender() 看起来对于我询问的情况来说已经足够了,但是很高兴了解更通用的 QSignalMapper 选项。
    • 此外,您可以在 QAction 上使用 QObject::setProperty() 将额外的每项数据传递到您的插槽中。
    • QAction::setData 可能比QObject::setProperty 好。
    • @LukášLalinský > QAction::setData 可能优于 QObject::setProperty 为什么你这么认为?
    【解决方案3】:

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

    【讨论】:

    • 完全正确 - 在您的插槽中,您可以执行以下操作:QAction *pAction = qobject_cast(sender());
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      相关资源
      最近更新 更多