QGraphicsItem.scene()的0/0点(限制项目移动)

时间:2012-06-20 12:30:49

标签: qt qgraphicsitem qgraphicsscene

我有限制移动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()的调用会为这两个项目返回不同的场景。

1 个答案:

答案 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);
    }
}