所有,

我有一个QGraphicsEllipseItemsetFlags(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呼叫,则仅在按下鼠标按钮时才会触发该事件……有什么想法吗?

最佳答案

知道了,这就是发生的事情,一旦您意识到它就很直观:

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

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

关于c++ - QGraphicsItem::SetCursor不会取消选择,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13293584/

10-09 18:08
查看更多