gpt4 book ai didi

qt - QGraphicsItem 移动事件 - 获取绝对位置

转载 作者:行者123 更新时间:2023-12-04 12:47:20 26 4
gpt4 key购买 nike

我有一个 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()));
}

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

如何获取拖动对象的当前位置?有没有其他方法可以实现目标?

最佳答案

这不是错误,而是标准行为。

构造函数要求 QRectF 来确定椭圆的大小和原点。两种常用的尺寸是 (0,0,width,height)(原点在左上角)和(-0.5 * width, -0.5 * height, width, height)(原点在中心)。

setPos ,该原点设置在所需位置。

关于qt - QGraphicsItem 移动事件 - 获取绝对位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21555639/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com