First, I have a list of QWidget
s that I won't know the length of until runtime. I then create a QListWidget
where I show them and when someone clicks them I use the signal currentItemChanged(QListWidgetItem*, QListWidgetItem*)
to catch it and get the clicked item's index.
Now I want to do a similar thing in the QMenu
. I will know the list when the QMenu
and its actions get built, but I won't be able to hard code this.
How can I create actions, catch their signals and connect them to the same slot which does different things depending on the action's position (index) in the menu list? There must be some way to solve this since other applications use this. I tried to look at mapping but I couldn't get my head around how to use it for this.
I tried to grab the sender
in the slot but was not able to get any useful information from it.
You can associate an index (or any other data) to each action when they are created with QAction::setData
and connect the signal QMenu::triggered(QAction*)
to your slot.
You'll then be able to retrieve the data through the QAction::data()
function of your slot parameter.
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();
}
Other methods: signal mapping or the use of sender()
, are explained in that article of Qt Quaterly.