【发布时间】:2009-10-15 22:31:39
【问题描述】:
在 Qt 应用程序中,我有一堆自动创建的 QActions(菜单项),我将它们添加到菜单栏中的菜单中。每个打开一个不同的文件。我想将它们全部连接到同一个插槽,以免多次编写相同的代码。但是,从那个槽中,我如何确定触发了哪些 QAction?
(例如:在 Cocoa 中,我会使用动作选择器中的 sender 参数来执行此操作。)
谢谢!
【问题讨论】:
标签: qt
在 Qt 应用程序中,我有一堆自动创建的 QActions(菜单项),我将它们添加到菜单栏中的菜单中。每个打开一个不同的文件。我想将它们全部连接到同一个插槽,以免多次编写相同的代码。但是,从那个槽中,我如何确定触发了哪些 QAction?
(例如:在 Cocoa 中,我会使用动作选择器中的 sender 参数来执行此操作。)
谢谢!
【问题讨论】:
标签: qt
我会连接到 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);
}
【讨论】:
connect(&menu, &QMenu::triggered, this, &MyObject::menuSelection);
你有两个选择:
sender(),将返回触发信号的动作。QSignalMapper。【讨论】:
QAction::setData 可能比QObject::setProperty 好。
在 Qt 中,您还可以访问发件人:QObject::sender。
【讨论】:
如上所述,您可以通过QObject::sender() 访问发射器句柄,这是 Qt 中的一个很棒的功能(尤其是在处理 n 数量的运行时、未知类型的动态实例对象时 - 可能在某个设置文件中定义)。
【讨论】: