大家好,我需要你的帮助,
我正在基于QGraphics框架在Qt中创建一个类似widget的时间轴。我的问题是在我的时间轴轨道中处理项目的冲突(继承自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;
}
}
即使我将鼠标移到视图/场景之外,如果它们到达我的timline轨道的左边界或右边界,也会立即停止这些项目。它就像一堵无形的墙。 现在,如果轨道中的一个项目与另一个项目发生碰撞,我想要相同的行为。
const QRectF parentRect(parentItem()->sceneBoundingRect());
const QRectF thisRect(sceneBoundingRect());
foreach (QGraphicsItem *qgitem, collidingItems()) {
TimelineItem *item = qgraphicsitem_cast<TimelineItem *>(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(第一个代码块)中的方式一样,隐形墙就像行为一样?
答案 0 :(得分:0)
我认为这里的问题是“thisRect”。如果你是从ItemPositionChange调用它,那么sceneBoundingRect将返回项目的前一个位置的边界矩形,而不是新的。即使发生了碰撞,当前位置也会成功,但是下一个失败是因为你总是检查以前的结果,然后它会快速恢复以避免碰撞。
获取本地项目的场景矩形后,您需要将其转换为项目的新未来位置:
QPointF new_pos (value.toPointF ());
QRectF thisRect (sceneBoundingRect());
thisRect.translate (new_pos - pos());
我已经在循环外部移动了“new_pos”的创建,以便它可用于矩形转换。它也更快。