Как квантовать положение нескольких элементов QGraphicsItems при перетаскивании мыши в QGraphicsView? - PullRequest
0 голосов
/ 10 августа 2011

Привет и спасибо за чтение.У меня возникают проблемы с корректным квантованием положения нескольких элементов QGraphicsItems при перетаскивании мыши в QGraphicsView.Система, которую я настроил, правильно выполняет квантование QGraphicsItem, если перетаскивает только по одному за раз, однако, если я выделил несколько элементов и перетащил их, квантовался только основной элемент (тот, который находится непосредственно под мышью), для остальных положение было установлено непрерывно,Я был бы очень признателен за любую помощь в этом.Ниже приведен соответствующий код:

Это класс MutaEvent, который наследуется от QGraphicsRectItem.Я переопределил функции mouseMoveEvent () и setPos ():

void MutaEvent::mouseMoveEvent( QGraphicsSceneMouseEvent * event )
{
    QGraphicsRectItem::mouseMoveEvent(event);
    setPos(pos());
}

void MutaEvent::setPos(const QPointF &pos)
{
    QGraphicsRectItem::setPos(Muta::quantizePointD(pos,30,15));
    emit posChanged(objectID,pos);
}

следующий бит - статическая функция в пространстве имен с именем Muta:

static QPointF quantizePoint(QPointF point,double xQuant, double yQuant)
{
    double x = quantize(point.x(),xQuant);
    double y = quantize(point.y(),yQuant);
    QPointF quantPoint(x,y);
    return quantPoint;
}

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 11 августа 2011

Посмотрите на переопределение защищенной функции QGraphicsItem::itemChange. Оттуда вы можете получать уведомления, когда позиция элемента собирается измениться (QGraphicsItem::ItemPositionChange), и у вас есть возможность изменить значение. Этот метод вызывается независимо от того, как было инициировано изменение (перемещение мыши, часть группы, установка в коде и т. Д.)

Я подозреваю, что частью вашей проблемы является то, что QGraphicsItem::setPos() является , а не виртуальным, что означает, что ваша функция setPos() не будет вызываться, если вызывающая сторона обрабатывает экземпляр вашего MutaEvent* как QGraphicsItem*. Это будет иметь место везде в среде Qt, поскольку, конечно, они не знают о вашем MutaEvent классе. Вот почему они предоставляют виртуальный метод itemChange.

0 голосов
/ 11 августа 2011

Являются ли все выбранные элементы вашим классом MutaEvent? setPos () вызывается для каждого выбранного элемента, поэтому в противном случае он просто использовал бы реализацию по умолчанию.

Вам может потребоваться реализовать собственную обработку событий мыши, если вы хотите, чтобы она работала правильно (и, кстати, вызов setPos (pos ()) в MutaEvent :: mouseMoveEvent не будет иметь никакого эффекта).

...