视图中的MousePressEvent和Qt中的项目

时间:2012-04-10 02:56:08

标签: 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";
}

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

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

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

A点击场景但不在项目中由场景处理。但点击项目 不要由物品本身处理,而是由场景处理。除非您在场景和项目处理的项目上快速点击2次。

有什么想法吗?

1 个答案:

答案 0 :(得分: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的文档,了解如何解决此问题。