2012-04-10 9 views
1

私はカスタムQGraphicsViewとカスタムQGraphicsItemを持っています。アイテムをクリックするとアイテムにクリックが処理され、そうでなければビューで処理されるようにします。ビュー内のMousePressEventとQtのアイテム

しかし、アイテムをクリックすると、そのアイテムがクリックを処理します。これで結構です。しかし、他の場所をクリックすると、クリックはまったく処理されません。私のクラスの中で、mouseEventsと何か関係のあるコードはすべて下にあります。

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

のCustomViewは、すべてのMouseEventsを処理します。

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

シーンでのクリックが、項目にシーンによって処理されませ:

EDIT

は、だから今、私はそれを変更しました。しかし、アイテム のクリックはアイテム自体によって処理されず、代わりにシーンによって処理されます。本当に素早く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に追加しました。ここでアイテムのないどこかをクリックすると、シーンがクリックを処理します。アイテムをクリックすると、そのシーンも私のクリックを処理します。しかし、アイテムを2回すばやくクリックすると、アイテムとシーンがクリックを処理します。 – fibera

+0

@fibera私は自分の答えに間違いを感じました。編集された答えを試して、それがどうなるか教えてください。 – Anthony

+0

それはトリックを行います。あなたの時間と忍耐のためにタイ。 – fibera

関連する問題