Russian Qt Forum
Сентябрь 21, 2024, 13:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Ограничение перемещения QGraphicsItem  (Прочитано 7612 раз)
edain
Гость
« : Декабрь 15, 2006, 11:46 »

Как ограничить перемещение QGraphicsItem так, чтобы он мог перемещаться только по горизонтали или вертикали? Вообще ничего в голову не лезет.

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

Qt: 4.2.0 под MSVC2005
Записан
ElderOrb
Гость
« Ответ #1 : Декабрь 15, 2006, 12:39 »

наверное как-то так:
c помощью
void QGraphicsItem::setFlag ( GraphicsItemFlag flag, bool enabled = true )
делаем итем неперемещабельным средствами фрэймворка, далее отлавливаем события мышки в virtual void hoverMoveEvent ( QGraphicsSceneHoverEvent * event ) и пишем там свою логику перемещения.
Записан
3aTBoPHuK
Гость
« Ответ #2 : Июнь 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());
Записан
frostyland
Гость
« Ответ #3 : Июль 20, 2010, 10:17 »

Здравствуйте!

А есть ли в природе QGraphicsItem - контейнер, ограничивающий перемещение детей своими размерами?
Записан
3aTBoPHuK
Гость
« Ответ #4 : Июль 20, 2010, 15:45 »

Скорее всего нет.

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


Страница сгенерирована за 0.12 секунд. Запросов: 21.