Дрожание/дрожание при столкновении QGraphicsItemC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Дрожание/дрожание при столкновении QGraphicsItem

Сообщение Anonymous »

Я создаю виджет временной шкалы в Qt на основе платформы QGraphics. Моя проблема заключается в обработке коллизий элементов (унаследованных от QGraphicsRectItem) на моих дорожках временной шкалы.
Я использую функцию itemChange() для отслеживания коллизий. Чтобы сохранить элементы в родительском BoundingRect, я использую следующий код, который работает как шарм

Код: Выделить всё

if (change == ItemPositionChange && scene())
if (thisRect.intersects(parentRect)) {
const QPointF offset(mapFromParent(thisRect.topLeft()));
QPointF newPos(value.toPointF());

if (snapToGrid) {
newPos.setX(floor(qMin(parentRect.right() - offset.x() - thisRect.width(),
qMax(newPos.x(), parentRect.left() / 2 - offset.x())) / (snapValue * pxPerSec(duration))) * snapValue * pxPerSec(duration));
}
else {
newPos.setX(qMin(parentRect.right() - offset.x() - thisRect.width(),
qMax(newPos.x(), parentRect.left() - offset.x())));
}

newPos.setY(parentItem()->boundingRect().height() * 0.1);
return newPos;
}
}
Это немедленно останавливает элементы, если они достигают левой или правой границы дорожек моей временной шкалы, даже если я перемещаю мышь за пределы моего представления/сцены. Это похоже на невидимую стену.
Теперь я хочу того же самого поведения, если один элемент на дорожке сталкивается с другим.

Код: Выделить всё

const QRectF parentRect(parentItem()->sceneBoundingRect());
const QRectF thisRect(sceneBoundingRect());

foreach (QGraphicsItem *qgitem, collidingItems()) {
TimelineItem *item = qgraphicsitem_cast(qgitem);
QPointF newPos(value.toPointF());

if (item) {
const QRectF collideRect = item->sceneBoundingRect();
const QPointF offset(mapFromParent(thisRect.topLeft()));

if (thisRect.intersects(collideRect) && thisRect.x() < collideRect.x()) {
newPos.setX(collideRect.left() - offset.x() - thisRect.width());
}

if (thisRect.intersects(collideRect) && thisRect.x() > collideRect.x()) {
newPos.setX(collideRect.right() + offset.x());
}

}

newPos.setY(parentItem()->boundingRect().height() * 0.1);
return newPos;
}
Проблема в том, что если я перемещаю элемент с помощью мыши на другой элемент, вы видите, что они пересекаются/перекрываются, а затем перемещенный мной элемент возвращается на минимальное непересекающееся расстояние. Как мне немедленно остановить движущийся предмет, если он ударится о другой (без дрожи, пересекающего движение вперед и назад). Так же, как и то, как элементы хранятся в родительском объектеboundingRect (первый блок кода), поведение, похожее на невидимую стену?

Подробнее здесь: https://stackoverflow.com/questions/404 ... er-tremble
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Отслеживание QGraphicsItem поверх видео
    Anonymous » » в форуме C++
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Как ограничить область в QGraphicsScene, куда можно перемещать пользовательский QGraphicsItem?
    Anonymous » » в форуме Python
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Позиция QGraphicsItem после измененияboundingRect
    Anonymous » » в форуме C++
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Qgraphicsscenehoverevent только размножается наиболее qgraphicsitem
    Anonymous » » в форуме C++
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Получить размер QgraphicsView от QGraphicSitem
    Anonymous » » в форуме C++
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»