2

私のアプリケーションには、2 つのオブジェクト タイプがあります。1 つはフィールド アイテム、もう 1 つは複合アイテムです。複合アイテムには、2 つ以上のフィールド アイテムが含まれる場合があります。これが私の複合アイテムの実装です。

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

私の最初の質問は、コンテキスト メニュー イベントを特定の子に伝達する方法です。

コンポジット1

上の写真は、可能な複合アイテムの 1 つを示しています。

上記のコードを見ると、コンテキスト メニュー イベントが発生したときに "Test" と表示されることがわかります。

ライン シンボルを右クリックすると、「テスト」メッセージが表示されます。しかし、信号記号「テスト」を右クリックしても印刷されず、印刷したいです。

私の2番目の質問は、この動作の原因です。どうすればこれを克服できますか。

4

2 に答える 2

0

イベントをキャッチするための2つの解決策があるかもしれないと私は考えました。1つ目は、形状関数の再実装です。私の場合、このように実装されます。

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

2つ目は、QGraphicsItemGroup を使用することです。アイテムをシーンに直接追加する場合は、QGraphicsItemGroup
使用することをお勧めします。しかし、私の場合、レイアウトを使用しているため、 QGraphicsItemGroupをサブクラス化する必要があります。だから一時的に私は自分のアイテムを書くことを選びます。

于 2010-05-13T07:20:51.817 に答える
0

代わりに、mouseRelease イベントを使用して contextMenu を再実装してみてください。

void CompositeItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
        if(event->button() == Qt::RightButton)
        {
            contextMenu->popup(QCursor::pos());
        }
}
于 2010-05-11T21:51:08.683 に答える