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 处理所有鼠标事件。

如何让 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 回答