2010-05-11 5 views
2

내 응용 프로그램에는 두 가지 객체 유형이 있습니다. 하나는 필드 항목이고 다른 하나는 복합 항목입니다. 복합 항목에는 둘 이상의 필드 항목이 포함될 수 있습니다. 내 복합 상품 구현은 다음과 같습니다.QGraphicsWidget의 상황에 맞는 메뉴

#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"를 마우스 오른쪽 버튼으로 클릭하면 인쇄되지 않고 인쇄됩니다.

두 번째 질문은 무엇입니까? 어떻게 이것을 극복합니까?

+0

첫 번째 질문을 찾을 수 없습니다. – mosg

+0

@mosg 죄송합니다. 첫 번째 질문을 쓰는 것을 잊어 버렸습니다. 나는 그 질문을 편집했다. – onurozcelik

답변

0

대신 mouseRelease 이벤트로 contextMenu를 다시 구현해보십시오.

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

조언으로 boundingRect 코드를 편집했습니다. 나는 아이의 경계를 단결시키는 것은 깔끔한 생각이라고 생각한다. 그러나 이번에는 contextmenuevent 및 mousepressevent와 같은 이벤트를 catch 할 수 없습니다. 그래서 제 이전 문제는 사건을 잡는 것입니다. 이 문제를 일으킬 수있는 아이디어가 있습니까? – onurozcelik

0

이벤트를 잡는 방법에는 두 가지 해결책이있을 수 있습니다. 첫 번째 것은 shape 함수를 다시 구현합니다. 제 경우에는 이와 같이 구현 될 것입니다.

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

두 번째는 당신이 diretly 장면에 항목을 추가 할 경우 QGraphicsItemGroup를 사용하는 것은 좋은 생각이 될 것입니다 QGraphicsItemGroup
을 사용하는 것입니다. 하지만 제 경우에는 레이아웃을 사용하기 때문에 서브 클래스 QGraphicsItemGroup을 사용해야합니다. 그래서 일시적으로 나 자신의 항목을 쓰는 것을 선택합니다.