Как узнать, какая из QGraphicsItems перемещается в данный момент? - PullRequest
0 голосов
/ 11 июня 2019

У меня есть 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);
}

У меня есть метод установки подвижных элементов.Если я использую этот метод, предметы становятся подвижными, и я доволен результатом.Но моя текущая цель - узнать, какой из предметов перемещается в данный момент.Это можно сделать?Как?Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Во-первых, заставьте QGraphicsItem реагировать на изменение позиции следующим образом:

item->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | 
QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemSendsScenePositionChanges);

, затем вы можете переопределить событие изменения и подать сигнал оттуда:

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);
 }
}
0 голосов
/ 11 июня 2019

Вы можете перехватить (нажатие и перемещение мыши) события , отправленные на QGraphicsItem из QGraphicsScene, а затем, например, подать сигнал, к которому вы можете подключиться.

...