0

全部,

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

我决定变得花哨,setCursor(Qt::OpenHandCursor)让用户知道他们可以通过点击来移动它。但是,现在松开鼠标左键就不会松开了?我究竟做错了什么?


示例代码:自定义 QGraphicItem 和重绘问题

注意:我删除了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;

我想指出, myQGraphicsEllipseItem是由一个 custom 为父的QGraphicsItem。我不改变父母/自定义项目光标,只有椭圆的。我没有遇到非父省略号的这个问题......


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

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

4

1 回答 1

2

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

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

通常,QGraphicsScene只有在按住按钮时才会获得鼠标移动事件。

于 2012-11-08T19:10:18.553 回答