Название: Ограничение перемещения 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) Для предотвращения перемещения итема например по Х, нужно вставить после 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(). |