QGraphicsItem :: SetCursor不会取消选择

时间:2012-11-08 16:44:27

标签: c++ qt

所有

我有QGraphicsEllipseItem setFlags(Qt::ItemIsSelectable | Qt::ItemIsMovable)。这允许我在QGraphicsView中快速拖动和移动椭圆。

我决定很喜欢,setCursor(Qt::OpenHandCursor)让用户知道他们可以通过点击来移动它。但是,现在当我放开鼠标左键时它不会松开?我做错了什么?


示例代码:Custom QGraphicItem and Repaint Issues

注意:我删除了update()个来电,并添加了prepareGeometryChange()个来电。 现在修改MakeNewPoint函数:

QGraphicsEllipseItem * InteractivePolygon::MakeNewPoint(QPointF & new_point)
{
   QGraphicsEllipseItem * result = 0;
   result = new QGraphicsEllipseItem();
   result->setPos(new_point);
   result->setRect(-4, -4, 8, 8);
   result->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable)
   result->setCursor(Qt::OpenHandCursor); //Setting this removes my ability to let go of an item. NOTE: result is parented by this.

   return result;
}

后:

 QGraphicsEllipseItem * new_item = MakeNewPoint(bla);
 new_item->setParent(this);
 //add it to my QList<QGraphicsEllipseItem *> m_points;

我想指出,我的QGraphicsEllipseItem是自定义QGraphicsItem的父级。我不更改父/自定义项目光标,只更改椭圆。我没有遇到非父级椭圆的问题......


有趣的结果:所以我的类自定义QGraphicsItem类(省略号的父级)是一个QObject,所以我可以从场景中过滤传入的鼠标事件。我在我的自定义类的构造函数中做了setCursor(Qt::ArrowCursor) ...这里有趣的地方:

即使没有按下鼠标按钮,eventFilter现在也会捕获(event->type() == QEvent::GraphicsSceneMouseMove)。如果我没有setCursor调用,那么只有在按下鼠标按钮时才触发该事件...想法?

1 个答案:

答案 0 :(得分:2)

好的,这就是正在发生的事情,一旦你意识到这一点就很直观:

当您将QGraphicsItem设置为唯一光标时,QGraphicsView必须setMouseTracking(true),否则QGraphicsScene将永远不知道何时更改光标(即何时更改光标)使用唯一光标在图形项目上。)鼠标移动事件正在影响我的椭圆。

通常情况下,QGraphicsScene只会在按下按钮时获取鼠标移动事件。