2012-04-10 4 views
1

사용자 지정 QGraphicsView 및 사용자 지정 QGraphicsItem이 있습니다. 항목을 클릭하면 항목이 내 클릭을 처리하도록하고, 그렇지 않으면보기가 처리하도록합니다.MousePressEvent보기 및 Qt의 항목

하지만 항목을 클릭하면 항목이 클릭을 처리합니다. 괜찮아. 그러나 다른 곳을 클릭하면 클릭이 전혀 처리되지 않습니다. 내 수업에서 마우스 이벤트와 관련이있는 코드는 모두 아래에 있습니다.

void CustomView::mousePressEvent(QMouseEvent *event){ 
    cout << "pressing in view"; 
} 

있는 CustomView 모든 MouseEvent는 처리 :

class CustomView : public QGraphicsView 
{ 
    Q_OBJECT 

public: 

    void mousePressEvent(QGraphicsSceneMouseEvent *event); 

}; 

void CustomView::mousePressEvent(QGraphicsSceneMouseEvent *event){ 
    cout << "pressing in view"; 
} 

class CustomItem : public QGraphicsItem 
{ 
public: 
    CustomItem(CustomView* widget) 
    void mousePressEvent(QGraphicsSceneMouseEvent *event); 
}; 

CustomItem::CustomItem(CustomView* widget){ 
    setFlag(ItemIsSelectable); 
    setFlag(ItemIsMovable); 
} 

void CustomItem::mousePressEvent(QGraphicsSceneMouseEvent *event){ 
    cout << "pressing in item"; 
} 

내가에있는 CustomView에 CustomItem에 클래스 변경에서 mousePressEvent 기능을 mousePressEvent 기능을 제거 할 때 것으로 보인다.

어떻게하면 CustomItem이 항목의 클릭을 처리하고 CustomView가 다른 모든 클릭을 처리하게 할 수 있습니까?

감사합니다.

class CustomView : public QGraphicsView 
{ 
    Q_OBJECT 

public: 

}; 

class CustomScene : public QGraphicsScene 
{ 
protected: 
    void mousePressEvent(QGraphicsSceneMouseEvent *event); 
}; 


void CustomScene::mousePressEvent(QGraphicsSceneMouseEvent *event){ 
    cout << "pressing in scene"; 
} 

class CustomItem : public QGraphicsItem 
{ 
public: 
    CustomItem(CustomView* widget) 
protected: 
    void mousePressEvent(QGraphicsSceneMouseEvent *event); 
}; 

CustomItem::CustomItem(CustomView* widget){ 
    setFlag(ItemIsSelectable); 
    setFlag(ItemIsMovable); 
} 

void CustomItem::mousePressEvent(QGraphicsSceneMouseEvent *event){ 
    cout << "pressing in item"; 
} 

장면에서 클릭 만 항목에 현장에서 처리되지 :

편집

그래서 지금은 그것을 변경되었습니다. 그러나 항목 의 클릭은 항목 자체에서 처리되지 않으며 대신 장면에서 처리됩니다. 항목에서 실제로 빠르게 2 번 클릭하지 않으면 장면과 항목에 의해 처리됩니다.

아이디어가 있으십니까?

+0

QGraphicsView 대신 QGraphicsScene :: mousePressEvent (QGraphicsSceneMouseEvent * mouseEvent) 메서드를 재정의하려고 시도하십시오. – Kunal

+0

"CustomWidget :: mousePressEvent"가 "CustomView :: mousePressEvent"(또는 그 반대)라고 생각합니다. – Anthony

+0

@Kunal Ty 입력 한대로 mousePressEvent를 장면으로 옮겼지만 여전히 문제가 있습니다 – fibera

답변

4

QGraphicsView는 장면 별 이벤트를 처리하기에 적합하지 않습니다. 대신 QGraphicsScene :: mousePressEvent를 재정의해야합니다. 나는 이런 식으로 뭔가를 추천 할 것입니다 : true로 설정 ItemIgnoresTransformations 플래그 항목이있는 경우 QGraphicsScene이 :: itemAt 당신에게 어려움을 줄 수도

void CustomScene::mousePressEvent(QGraphicsSceneMouseEvent *event) 
{ 
    if (itemAt(event) == NULL) 
    { 
    // do stuff if not clicked on an item 
    } 
    else 
    { 
    QGraphicsScene::mousePressEvent(event); // this forwards the event to the item 
    } 
} 

참고. 이 문제를 해결하는 방법은 QGraphicsScene :: itemAt 문서를 참조하십시오.

+0

좋아, 그래서 QGraphicsView :: mousePressEvent (QGraphicsSceneMouseEvent) 제거하고 해당 기능을 사용자 지정 QGraphicsScene 추가되었습니다. 이제 항목이 아닌 다른 곳을 클릭하면 장면이 내 클릭을 처리합니다. 항목을 클릭하면 장면이 내 클릭을 처리합니다. 그러나 항목을 매우 빠르게 두 번 클릭하면 항목과 장면이 내 클릭을 처리합니다. – fibera

+0

@fibera 나는 내 대답에서 실수를 깨달았다. 수정 된 답변을 시험해보고 그것이 어떻게 진행되는지 알려주십시오. – Anthony

+0

그 트릭을 않습니다. 귀하의 시간과 인내심을 위해 타이. – fibera