Контекстное меню на QGraphicsWidget - PullRequest
2 голосов
/ 11 мая 2010

В моем приложении у меня есть два типа объекта. Один из них - элемент поля, другой - составной элемент. Составные элементы могут содержать два или более полевых элемента. Вот моя реализация составного элемента.

#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";
     }

Мой первый вопрос - как передать событие контекстного меню конкретному дочернему элементу.

композитный * http://img169.imageshack.us/img169/9079/composite1.jpg

На рисунке выше показан один из моих возможных составных элементов.

Если вы посмотрите на код выше, вы увидите, что я печатаю «Тест», когда происходит событие контекстного меню.

Когда я щелкаю правой кнопкой мыши по символу линии, я вижу, что напечатано сообщение «Тест». Но когда я щелкаю правой кнопкой мыши по сигналу, символ «Тест» не печатается и я хочу, чтобы он был напечатан.

Мой второй вопрос, что является причиной такого поведения. Как мне это преодолеть.

Ответы [ 2 ]

0 голосов
/ 13 мая 2010

Я понял, что может быть два решения для ловли событий. Первый - переопределение функции shape . В моем случае это будет реализовано так.

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

Второй - использовать QGraphicsItemGroup
Будет хорошей идеей использовать QGraphicsItemGroup , если вы прямо добавляете свои элементы в сцену. Но в моем случае я должен подкласс QGraphicsItemGroup , потому что я использую макет. Поэтому временно я выбираю написание своего предмета.

0 голосов
/ 12 мая 2010

Не могли бы вы попытаться переопределить ваш contextMenu с помощью события mouseRelease?

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