Точка 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);
}
}