3

カスタムQGraphicsViewとカスタムQGraphicsItemがあります。アイテムをクリックした場合にアイテムがクリックを処理するようにします。それ以外の場合は、ビューによってクリックが処理されるようにします。

しかし、アイテムをクリックすると、アイテムがクリックを処理します。これで結構です。しかし、他の場所をクリックすると、クリックはまったく処理されません。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";
}

CustomItemクラスからmousePressEvent関数を削除し、CustomViewでmousePressEvent関数を次のように変更すると、次のようになります。

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

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

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回速くクリックしない限り、シーンとアイテムによって処理されます。

何か案は?

4

1 に答える 1

5

QGraphicsViewは、シーン固有のイベントを処理するのに実際には適した場所ではありません。代わりに、QGraphicsScene::mousePressEventをオーバーライドする必要があります。私はこのようなものをお勧めします:

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

ItemIgnoresTransformationsフラグがtrueに設定されているアイテムがある場合、QGraphicsScene::itemAtで問題が発生する可能性があることに注意してください。これを解決する方法については、QGraphicsScene::itemAtのドキュメントを参照してください。

于 2012-04-10T04:40:17.517 に答える