QGraphicsWidget上的上下文菜单

时间:2010-05-11 08:06:39

标签: c++ qt qt4 contextmenu qt-contextmenu

在我的应用程序中,我有两个对象类型。一个是字段项,另一个是复合项。 复合项目可能包含两个或多个字段项目。 这是我的复合项目实现。

#include "compositeitem.h"

CompositeItem::CompositeItem(QString id,QList<FieldItem *> _children)
{
   children = _children;
}

CompositeItem::~CompositeItem()
{
}

QRectF CompositeItem::boundingRect() const
{
 FieldItem *child;
     QRectF rect(0,0,0,0);
     foreach(child,children)
     {
        rect = rect.united(child->boundingRect());
     }
    return rect;
}

void CompositeItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,   QWidget *widget )
  {
   FieldItem *child;
   foreach(child,children)
   {
      child->paint(painter,option,widget);
   }
  }

  QSizeF CompositeItem::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
  {
   QSizeF itsSize(0,0);
   FieldItem *child;
   foreach(child,children)
   {
      // if its size empty set first child size to itsSize
      if(itsSize.isEmpty())
          itsSize = child->sizeHint(Qt::PreferredSize);
      else
      {
          QSizeF childSize = child->sizeHint(Qt::PreferredSize);
              if(itsSize.width() < childSize.width())
                  itsSize.setWidth(childSize.width());
              itsSize.setHeight(itsSize.height() + childSize.height());
      }
  }
  return itsSize;
     }

     void CompositeItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
     {
          qDebug()<<"Test";
     }

我的第一个问题是如何将上下文菜单事件传播给特定的孩子。

composite1 http://img169.imageshack.us/img169/9079/composite1.jpg

上面的图片展示了我可能的复合项目之一。

如果您查看上面的代码,您会看到我在上下文菜单事件发生时打印“测试”。

当我右键单击线符号时,我看到“Test”消息被打印出来。 但是,当我右键单击信号符号时,“Test”不会被打印,我希望它被打印出来。

我的第二个问题导致这种行为的原因。 我该如何克服这一点。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用mouseRelease事件重新实现contextMenu吗?

void CompositeItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
        if(event->button() == Qt::RightButton)
        {
            contextMenu->popup(QCursor::pos());
        }
}

答案 1 :(得分:0)

我发现可能有两种捕获事件的解决方案。 第一个是重新实现shape功能。 就我而言,它将像这样实现。

QPainterPath shape() const
{
  QPainterPath path;
  path.addRect(boundingRect());
  return path;
}

第二个是使用QGraphicsItemGroup
如果您直接将项目添加到场景中,最好使用QGraphicsItemGroup。但在我的情况下,我必须子类QGraphicsItemGroup,因为我正在使用布局。 所以暂时我选择自己编写项目。