Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: edain от Декабрь 15, 2006, 11:46



Название: Ограничение перемещения QGraphicsItem
Отправлено: edain от Декабрь 15, 2006, 11:46
Как ограничить перемещение QGraphicsItem так, чтобы он мог перемещаться только по горизонтали или вертикали? Вообще ничего в голову не лезет.

Объясню всю задачу: делаю простенький графический редактор для курсача. Предполагается, что объекты можно перетаскивать, масштабировать и поворачивать. Для последних двух операций я прикручиваю к объекту маркеры (маленькие кружочки, перетаскивая которые можно производить эти операции). Так вот, маркеры Top и Bottom должны перемещаться только по вертикали, а Left и Right - только по горизонтали.

Qt: 4.2.0 под MSVC2005


Название: Ограничение перемещения QGraphicsItem
Отправлено: ElderOrb от Декабрь 15, 2006, 12:39
наверное как-то так:
c помощью
void QGraphicsItem::setFlag ( GraphicsItemFlag flag, bool enabled = true )
делаем итем неперемещабельным средствами фрэймворка, далее отлавливаем события мышки в virtual void hoverMoveEvent ( QGraphicsSceneHoverEvent * event ) и пишем там свою логику перемещения.


Название: Re: Ограничение перемещения QGraphicsItem
Отправлено: 3aTBoPHuK от Июнь 22, 2010, 09:51
Для тех, кому еще может быть нужно...
Вот цитата из справки по QGraphicsItem, в которой перемещение итема ограничивается размерами сцены:

Код:
 QVariant Component::itemChange(GraphicsItemChange change, const QVariant &value)
 {
     if (change == ItemPositionChange && scene()) {
         // value это новое положение.
         QPointF newPos = value.toPointF();
         QRectF rect = scene()->sceneRect();
         if (!rect.contains(newPos)) {
             // Сохраняем элемент внутри прямоугольника сцены.
             newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left())));
             newPos.setY(qMin(rect.bottom(), qMax(newPos.y(), rect.top())));
             return newPos;
         }
     }
     return QGraphicsItem::itemChange(change, value);
 }

Для предотвращения перемещения итема например по Х, нужно вставить после QPointF newPos = value.toPointF(); следующий код:
Код:
newPos.setX(x());


Название: Re: Ограничение перемещения QGraphicsItem
Отправлено: frostyland от Июль 20, 2010, 10:17
Здравствуйте!

А есть ли в природе QGraphicsItem - контейнер, ограничивающий перемещение детей своими размерами?


Название: Re: Ограничение перемещения QGraphicsItem
Отправлено: 3aTBoPHuK от Июль 20, 2010, 15:45
Скорее всего нет.

Можно данную задачу решить через переопределение itemChange для потомков.
Из справки: "Если у элемента есть родитель, то его позиция указывается в координатах родителя (т.е., в локальной системе координат родителя)."
Размер родителя в потомке можно узнать через вызов parentItem()->boundingRect () или parentItem()->boundingRegion().