QGraphicsItem移动事件 - 获得绝对位置

时间:2014-02-04 14:50:22

标签: qt draggable qtgui

我有QGraphicsEllipseItem我想要移动并在移动时触发信号。 因此,我将QGraphicsEllipseItemQObject子类化,并覆盖itemChange方法以触发信号。这一切似乎都有效,但报告的位置似乎与项目的旧位置有关。即使询问项目的位置似乎只是检索相对坐标。

以下是一些代码,以明确我所做的事情:

class MyGraphicsEllipseItem: public QObject, public QGraphicsEllipseItem
{
  Q_OBJECT

public:

  MyGraphicsEllipseItem(qreal x, qreal y, qreal w, qreal h, QGraphicsItem *parent = 0, QGraphicsScene *scene = 0)
    :QGraphicsEllipseItem(x,y,w,h, parent, scene)
  {}

  QVariant itemChange(GraphicsItemChange change, const QVariant &value);

signals:
  void itemMoved(QPointF p);
};

QVariant MyGraphicsEllipseItem::itemChange( GraphicsItemChange change, const QVariant  &value )
{ 
  // value seems to contain position relative start of moving
  if (change == ItemPositionChange){
    emit itemMoved(value.toPointF());
  }
  return QGraphicsEllipseItem::itemChange(change, value); // i allso tried to call this before the emiting
}

这是项目创建:

  MyGraphicsEllipseItem* ellipse = new MyGraphicsEllipseItem(someX, someY, someW, someH);
  ellipse->setFlag(QGraphicsItem::ItemIsMovable, true);
  ellipse->setFlag(QGraphicsItem::ItemSendsScenePositionChanges, true);
  connect(ellipse, SIGNAL(itemMoved(QPointF)), SLOT(on_itemMoved(QPointF)));
  graphicsView->scene()->addItem(ellipse);

和插槽:

void MainWindow::on_itemMoved( QPointF p)
{
  MyGraphicsEllipseItem* el = dynamic_cast<MyGraphicsEllipseItem*>(QObject::sender());
  QPointF newPos = el->scenePos();
  scaleLbl->setText(QString("(%1, %2) - (%3, %4)").arg(newPos.x()).arg(newPos.y()).arg(p.x()).arg(p.y()));
}

奇怪的是,newpos和p几乎相等但包含相对于运动开始的坐标。

如何获取拖动对象的当前位置?还有另一种方法来实现目标吗?

2 个答案:

答案 0 :(得分:3)

它不是一个错误,它是标准行为。

构造函数要求QRectF确定椭圆的大小和原点。两种常用尺寸是(0,0,宽度,高度)(原点在topleft)和(-0.5 *宽度,-0.5 *高度,宽度,高度)(原点在中心)。

使用setPos,将原点设置在所需位置。

答案 1 :(得分:1)

我找到了原因: 构造函数QGraphicsEllipseItem::QGraphicsEllipseItem ( qreal x, qreal y, qreal width, qreal height, QGraphicsItem * parent = 0 )无法按预期工作。在用一些x和y调用它之后,该项仍然报告0,0作为其位置。给构造函数赋予0,0并用setPos(x,y)明确设置位置解决问题。

我真的很想知道这是出于这种行为的意图。文档没有给出任何暗示。