0

我正在从我的应用程序启动时读取的 xml 文件中的条目中填充系统托盘图标菜单 (QMenu)。

我不确定如何正确设置动作的 SLOT 端:

QList<CMenuItem> menuItems = m_layout->getMenuItems();   
QListIterator<CMenuItem> iter(menuItems);
while (iter.hasNext())
{
    CMenuItem menuItem = iter.next();    
    QAction *action = new QAction(menuItem.qsTitle, this);
    connect(action, SIGNAL(triggered()), this, SLOT(launchMenuItem()));
    trayIconMenu->addAction(action);
}

我的“launchMenuItem()”SLOT 如何知道触发了哪个菜单项?我无法为每个菜单项创建一个 SLOT,因为在运行之前我不知道有多少项存在。

我可以想到一些丑陋的方法来做到这一点,但我正在寻找正确的方法。

4

1 回答 1

1

我通常做的是用来QAction::setData(const QVariant&)存储我需要的任何操作 ID。然后在插槽端,我检索 IDQAction::data()并采取相应的行为。请注意,QVariant显然接受的不仅仅是基本 int (这是我用来识别操作的),您可以传递任何QVariant-compatible 信息。

编辑:哦!顺便说一句,这有点难看,因为我利用它QObject::sender()来将触发的动作施放回去。很抱歉,但它仍然有效。

于 2013-01-22T20:19:19.743 回答