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

标签 c++ qt slot qmenu

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

现在我想在 QMenu 中做类似的事情。当 QMenu 及其操作构建时,我会知道该列表,但我无法对其进行硬编码。

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

我尝试在插槽中抓取 sender,但无法从中获取任何有用信息。

最佳答案

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

然后您就可以通过您的 slot 参数的 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++ - 如何将 QActions 列表添加到 QMenu 并使用单个插槽处理它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9187538/

相关文章:

c++ - 将 GTKmm 添加到 CodeBlocks - Windows

c++ - hash_map值删除

c++ - 错误 "C1083 cannot open include file gecode/int.hh"尽管路径设置正确

c++ - QString: 最多 2 位小数的数字,后面不带零

common-lisp - 基于 Common Lisp 对象系统类定义中的其他槽值初始化槽

python - PyQt 的 Signal/SLOT 不同类

c++ - 实用函数不会在 .h 文件中初始化并在 main.cpp 中定义

qt - 软件评估 - 许可证

c++ - Qt webkit 小部件错误

multithreading - 将 QList<QString>* 传递给来自 QThread 的信号