I have a QGraphicsView which contains many QGraphicsItem. If I click mouse right click on any QGraphicsItem, the item should get select and right menu options should appear and then I will choose one of the options among them.To do that I have installed eventFilter and through it, I am using ContextMenu to create right click menu. Right click menu are getting cretaed properly. But propblem is I am not getting how to connect them to some function so that I can write logic for it.
It means if I clicked on save option that particular QGraphicsItem should get select and I should be able to go to some function where I will write logic for saving.
bool myClass::eventFilter(QObject *watched, QEvent *event)
{
switch(event->type())
{
case QEvent::ContextMenu:
{
QMouseEvent *mouseEvent = static_cast<QMouseEvent*> (event);
menu = new QMenu(this);
option = menu->addMenu("CopyOption");
option->addAction("save");
menu->exec(mouseEvent->globalPos());
break;
}
default:
break;
}
}
In your approach you show a context menu when you have no information if any item is selected. It is rather bad idea. You don't want to show the context menu in any location of view. You have to check if a cursor mouse is over an item.
Why not to derive from
QGraphicsItemand just overloadmousePressEventmethod. Inside this method check if right button of mouse is clicked. If so, show context menu and test which action is clicked. Minimal code would be:All the job with checking is an item is under mouse is done by QT,
mousePressEventis invoked only if it is necessary.Another approach would be override
mousePressEventon QGraphicsView. Inside which:QGraphicsItemhasisUnderMousemethodQMenuand show itQAction, if it issavecall a proper method which doing the save and mark the item as selected