我有一个自定义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次。
有什么想法吗?
答案 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的文档,了解如何解决此问题。