我有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);
}
我有一种设置可移动项目的方法。如果我使用此方法,则项目将变得可移动,并且我对结果感到满意。但是我目前的目标是知道当前正在移动哪些物品。能做到吗怎么样?任何帮助表示赞赏。
答案 0 :(得分: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);
}
}
答案 1 :(得分:0)
您可以捕获(鼠标按下和移动)事件sent to QGraphicsItem
from QGraphicsScene
,然后-例如-发出可以连接的信号。