c – 如何将QActions列表添加到QMenu并使用单个插槽处理?

首先,我有一个QWidget的列表,我不知道直到运行时的长度.然后我创建一个QListWidget,我在其中显示它们,当有人点击它时,我使用signalItemChanged(QListWidgetItem *,QListWidgetItem *)信号来捕获它并获取点击的项目的索引.

现在我想在QMenu中做类似的事情.当我的QMenu和它的动作被建立时,我会知道这个列表,但是我将无法硬编码.

如何创建动作,捕捉他们的信号并将它们连接到同一个插槽,根据操作的菜单列表中的位置(索引)不同而不同.必须有一些方法解决这个问题,因为其他应用程序使用它.我试图看映射,但是我不知道如何使用它.

我试图在插槽中抓住发件人,但无法从中获取任何有用的信息.

解决方法

您可以使用QAction :: setData创建一个索引(或任何其他数据)到每个动作,并将QMenu :: triggered(QAction *)信号连接到您的插槽.

然后,您可以通过插槽参数的QAction :: data()函数检索数据.

MyClass::MyClass() {
    // menu creation
    for(...) {
        QAction *action = ...;
        action->setData(10);
        ...
        menu->addAction(action);
    }
    // only one single signal connection
    connect(menu,SIGNAL(triggered(QAction*)),this,SLOT(mySlot(QAction*)));
}

void MyClass::mySlot(QAction *action) {
   int value = action->data().toInt();

}

其他方法:信号映射或使用sender(),在that article of Qt Quaterly中进行了说明.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...