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次.
有任何想法吗?
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的文档,了解如何解决此问题.
归档时间: |
|
查看次数: |
8613 次 |
最近记录: |