我从QGraphicsView和QGraphicsRectItem派生。我在两个类上重载了contextMenuEvent,以提供弹出菜单。当你点击空白时,我想要QGraphicsView上下文菜单,当你点击一个项目时,我需要QGraphicsItem弹出菜单。
在第一次实现时,无论我点击哪里,我都会得到QGraphicsView弹出窗口。因此,我修改了contextMenuEvent如下:
void CustomGraphicsView::contextMenuEvent(QContextMenuEvent* event)
{
if (QGraphicsItem *item = itemAt(event->pos())) {
MyRect* rect = dynamic_cast<MyRect*>(item);
QGraphicsSceneContextMenuEvent* context_event = dynamic_cast<QGraphicsSceneContextMenuEvent*>(event);
if (rect && context_event)
rect->contextMenuEvent(context_event);
}
else {
QMenu menu;
... create the QGraphicsView popup menu
}
}
QGraphicsSceneContextMenuEvent的dynamic_cast失败,因此我从不调用rect的contextMenuEvent。如果我只是尝试将事件传递给rect->contextMenu(),它就不会编译,所以我尝试了强制转换。
做这件事的正确方法是什么?
这是一个学习项目,只需使用Qt创建/移动/旋转/删除2D形状。如果有人想看看整件事,请告诉我。
好吧,所以我想明白了。只需确保通过基类方法传递事件即可。易于理解的这也适用于mousePressEvent()、mouseMoveEvent()和mouseReleaseEvent函数。
void CustomGraphicsView::contextMenuEvent(QContextMenuEvent* event)
{
// if the event is on a GGraphicsItem just pass the event along
if (itemAt(event->pos())) {
QGraphicsView::contextMenuEvent(event);
}
else
{
QMenu menu;
... create popup for the CustomGraphicsView