视图中的MousePressEvent和Qt中的项目

fib*_*era 3 qt mouseevent mousepress

我有一个自定义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";
}
Run Code Online (Sandbox Code Playgroud)

似乎当我从CustomItem类中删除mousePressEvent函数并在CustomView中将mousePressEvent函数更改为:

void CustomView::mousePressEvent(QMouseEvent *event){
    cout << "pressing in view";
}
Run Code Online (Sandbox Code Playgroud)

CustomView处理所有mouseEvents.

如何让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";
}
Run Code Online (Sandbox Code Playgroud)

A单击场景但不在项目中由场景处理.但是项目中的点击不会被项目本身处理,而是由场景处理.除非你在场景和项目处理的项目上快速点击2次.

有任何想法吗?

Ant*_*ony 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
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您将ItemIgnoresTransformations标志设置为true,则QGraphicsScene :: itemAt可能会给您带来困难.查看QGraphicsScene :: itemAt的文档,了解如何解决此问题.