Контекстное меню в QGraphicsWidget с использованием addAction()

У меня есть собственный QGraphicsWidget в Qt5.4, к которому я пытаюсь добавить контекстное меню. В процедуре init() элемента я добавляю два элемента QAction следующим образом:

bool MyGraphicsWidget::init()
{
    this->addAction(new QAction("Rotate &Left", this));
    this->addAction(new QAction("Rotate &Right", this));
}

Но когда я пытаюсь открыть контекстное меню (щелкнув правой кнопкой мыши в Windows), ничего не появляется.

Документация, кажется, говорит, что я могу просто добавить элементы QAction, и контекстное меню будет работать без необходимости переопределять события мыши или события контекстного меню. Я попытался изменить contextMenuPolicy в QGraphicsView на ActionsContextMenu и флаги окна в QGraphicsWidget на ItemIsSelectable, но безрезультатно. Что мне здесь не хватает?


person Knute Knudsen    schedule 12.03.2015    source источник


Ответы (1)


Вам нужно использовать contextMenuEvent с QMenu:

void contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
{
    QMenu menu;
    menu.addAction(new QAction("Rotate &Left", this));
    menu.addAction(new QAction("Rotate &Right", this));
    menu.exec(event->screenPos());
}
person svlasov    schedule 12.03.2015
comment
Спасибо за ответ. Это то, что я в итоге сделал, но кажется странным, что QGraphicsWidget имел бы методы для добавления действий, если бы не было возможности отобразить контекстное меню с этими действиями. Вы уверены, что QGraphicsWidget::addAction() не работает? - person Knute Knudsen; 13.03.2015
comment
Возможно ошибка в Qt. Но поскольку QGraphicsWidget наследует QGraphicsItem, в документации говорится, что вам нужно вручную создать QMenu doc.qt. io/qt-5/qgraphicsitem.html#contextMenuEvent - person svlasov; 13.03.2015
comment
Да, я думаю, это либо ошибка API, либо есть другой флаг/свойство, которое мне нужно установить, чтобы включить контекстное меню. Похоже, что методы, связанные с QAction, были добавлены в QGraphicsWidget, чтобы нам не приходилось переопределять contextMenuEvent(). В любом случае, спасибо за вашу помощь. - person Knute Knudsen; 13.03.2015