如何知道当前正在移动哪个 QGraphicsItem?
Posted
技术标签:
【中文标题】如何知道当前正在移动哪个 QGraphicsItem?【英文标题】:How to know which of the QGraphicsItems is being moved at the moment? 【发布时间】:2019-06-11 13:11:29 【问题描述】:我有QGraphicsScene
,上面显示了一些自定义QGraphicsItems
。这些项目在类MeasurePoint
中进行了描述,该类继承自QGraphicsItem
。它们也存储在QList
,所以每个项目都有它的索引。它们像这样添加到场景中:
void MeasureSpline::addNode(qreal xPos, qreal yPos, QGraphicsScene *scene)
MeasurePoint *point = new MeasurePoint(xPos, yPos, points.size());
points.append(point);
point->setPoint(scene);
points
在哪里:
QList<MeasurePoint*> points;
每个MeasurePoint
的构造如下:
MeasurePoint::MeasurePoint(qreal a, qreal b, int c)
xPos = a;
yPos = b;
index = c;
movable = false;
selected = false;
而setPoint()
是:
void MeasurePoint::setPoint(QGraphicsScene *scene)
scene->addItem(this);
我有一种设置可移动项目的方法。如果我使用这种方法,这些物品就会变成可移动的,我对结果很满意。但我目前的目标是知道目前正在移动哪些项目。可以做到吗?如何?任何帮助表示赞赏。
【问题讨论】:
offtopic:setPoint(scene);
还是应该是setScene(scene);
?
@MarekR 就是这样,这里没有错。该函数将 MeasurePoint 添加到场景中
【参考方案1】:
首先,让 QGraphicsItem 像这样对位置变化做出反应:
item->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable |
QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemSendsScenePositionChanges);
然后您可以重新实现 Change-Event 并从那里发出信号:
QVariant Item::itemChange(GraphicsItemChange change, const QVariant &value)
if (change == ItemPositionChange && scene() || change == ItemScenePositionHasChanged) // either during mouseMoveEvent or when Dropped again
emit itemMoved(); // connect to other SLOT and cast QObject::sender() or something here....
return QGraphicsItem::itemChange(change, value);
编辑:
接收方法的未测试代码:
void MyClass::onItemMoved()
MesurePoint* item = dynamic_cast<MesurePoint*>(QObject::sender());
if (item != NULL)
int index = points.IndexOf(item);
【讨论】:
感谢您的回答。有没有办法改变 itemChange() 函数,使其返回正在移动的项目的索引?我在 MeasurePoint 类中有索引字段,它是在创建新的 MeasurePoint 对象时分配的。我可以以某种方式访问该函数中的该字段吗? return-Value 不是你感兴趣的东西。它只是将事件传递给 QGraphicsItem。我不知道您所说的“项目索引”是什么意思。它是它所持有的列表中项目的索引吗?我无法想象项目知道此索引的方式,但您可以在接收函数中遍历该列表,直到找到它。【参考方案2】:您可以捕捉(鼠标按下和移动)事件sent to QGraphicsItem
from QGraphicsScene
,然后 - 例如 - 发出一个您可以连接的信号。
【讨论】:
以上是关于如何知道当前正在移动哪个 QGraphicsItem?的主要内容,如果未能解决你的问题,请参考以下文章
oracle.exe接近100%,请问如何知道当前正在执行哪个sql语句?