Точка 0/0 QGraphicsItem.scene() (ограничение перемещения элемента)

У меня проблема с ограничением перемещения моих 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);
}

Этот код должен предотвратить перетаскивание элемента влево от сцены и, следовательно, увеличение его размера. Это вроде работает. Моя проблема:

Я вставляю в предметы при создании сцены. Один сидит в точке х =0 (координаты сцены), другой - в точке х =10 (координаты сцены). С помощью этого кода я НЕ МОГУ перетаскивать второй элемент слева от x=10.

Кажется, что вызов QGraphicsItem::scene() возвращает разные сцены для обоих элементов.

1 ответ

Решение

I've found the answer in this thread: 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);
    }
}
Другие вопросы по тегам