我正在从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,因为我不知道在运行时将存在多少个项目。

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

最佳答案

我通常要做的是使用QAction::setData(const QVariant&)存储我需要的任何操作ID。然后在插槽端,我使用QAction::data()检索ID并相应地执行操作。
请注意,QVariant显然比基本int(这是我用来识别动作)所接受的要多得多,您可以传递任何QVariant兼容的信息。

编辑:哦!顺便说一句,这有点丑陋,因为我利用QObject::sender()来回退触发的动作。抱歉,但是还是可以的。

关于c++ - 如何为运行时构造的菜单正确设置通用QT操作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14464884/

10-08 22:58