首先,我有一个 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/