如何知道当前正在移动哪个 QGraphicsItem?
How to know which of the QGraphicsItems is being moved at the moment?
我有 QGraphicsScene
,其中显示了一些自定义 QGraphicsItems
。这些项目在继承自 QGraphicsItem
的 class MeasurePoint
中进行了描述。它们也存储在 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);
}
我有一个设置项目可移动的方法。如果我使用这种方法,项目就会变得可移动,我对结果很满意。但我目前的目标是知道目前正在移动哪些项目。可以吗?如何?感谢您的帮助。
您可以捕获(鼠标按下和移动)事件 sent to QGraphicsItem
from QGraphicsScene
然后 - 例如 - 发出一个您可以连接的信号。
首先,让 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);
}
}
我有 QGraphicsScene
,其中显示了一些自定义 QGraphicsItems
。这些项目在继承自 QGraphicsItem
的 class MeasurePoint
中进行了描述。它们也存储在 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);
}
我有一个设置项目可移动的方法。如果我使用这种方法,项目就会变得可移动,我对结果很满意。但我目前的目标是知道目前正在移动哪些项目。可以吗?如何?感谢您的帮助。
您可以捕获(鼠标按下和移动)事件 sent to QGraphicsItem
from QGraphicsScene
然后 - 例如 - 发出一个您可以连接的信号。
首先,让 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);
}
}