2012-06-20 4 views
0

У меня есть проблема, ограничивающей ход моих QGraphicItems:точки 0/0 из QGraphicsItem.scene() (ограничение движения пункта)

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

Я нашел ответ в этой теме: 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); 
    } 
}