我有限制移动QGraphicItems的问题:
QVariant CustomRectItem::itemChange(GraphicsItemChange change, const QVariant& value)
{
if (change == QGraphicsItem::ItemPositionChange && this->scene()) {
// parameter value is the new position
QPointF newPos = value.toPointF();
QRectF rect = this->scene()->sceneRect();
// keep the item inside the scene rect
if (!rect.contains(newPos)) {
if(newPos.x() < rect.x())
newPos.setX(rect.x());
return newPos;
}
}
return QGraphicsItem::itemChange(change, value);
}
此代码应防止项目被拖动到场景的左侧 从而增加它的大小。它有点工作。 我的问题是:
我在创建场景时插入项目。 坐在x = 0(场景坐标)。另一个坐在x = 10(场景坐标。) 使用此代码,我无法拖动x = 10左边的第二个项目。
似乎对 QGraphicsItem :: scene()的调用会为这两个项目返回不同的场景。
答案 0 :(得分:0)
我在这个帖子中找到了答案: Why does QGraphicsItem::scenePos() keep returning (0,0)
问题出在项目的创建中。 小心不要将它们放在构造函数中。必须在出现在场景中之后定位它们......
for (int i = 0; i < 3; ++i){
for (int j = 0; j < 3; ++j){
item = new CustomRectItem(0, 0, 20, 20);
item->setFlags(QGraphicsItem::ItemIsMovable |
QGraphicsItem::ItemSendsScenePositionChanges);
scene->addItem(item);
item->setPos(i*30, j*30);
}
}