crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QGraphicsScene и "резиновый" квадрат
lifrost
  опции профиля:
сообщение 4.3.2011, 8:44
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 38
Регистрация: 4.3.2011
Из: Миасс
Пользователь №: 2468

Спасибо сказали: 0 раз(а)




Репутация:   0  


Доброе время суток. Есть проблема не знаю с какого бока подойти.
Собственно: мне необходимо сделать квадрат, что при перемещение его граней он растягивался (дорисовывался) + если пользователь взял квадрат за его угол, можно было бы менять наклон грани.
Я понял, что это нужно реализовывать в QGraphicsScene.
Что сделал (может я пошел не верным путем, поэтому спрашиваю):
1) создал 4е стенки, и образовал из них квадрат. Я так понял, если пользователь тянет за одну стенку, другие item будут дорисовываться:

pleftRect = new QGraphicsRectItem;
ptopRect = new QGraphicsRectItem;
pbottomRect = new QGraphicsRectItem;
prightRect = new QGraphicsRectItem;

2) пробовал ставить флаг QGraphicsItem::ItemIsMovable для item, но толку не увидел, элементы двигаются по всем осям
3) из 2го пункта понял, что нужно организовывать движение путем ввода событий mousePressEvent(QMouseEvent *e), mouseMoveEvent(QMouseEvent *e), mouseReleaseEvent(QMouseEvent *e). Но как это сделать пока не пойму.

Помогите пожалуйста, а то я что-то запутался и возможно не туда иду. Заранее всем большое спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Lappu
  опции профиля:
сообщение 31.3.2011, 22:04
Сообщение #2


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 30.3.2011
Пользователь №: 2558

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lifrost @ 4.3.2011, 9:44) *
из 2го пункта понял, что нужно организовывать движение путем ввода событий mousePressEvent(QMouseEvent *e), mouseMoveEvent(QMouseEvent *e), mouseReleaseEvent(QMouseEvent *e). Но как это сделать пока не пойму.


Зачем для того, чтобы нарисовать 1 прямоугольник, понадобились 4 элемента-прямоугольника, если можно и скорее всего нужно одним обойтись?

Вообщем такого рода задачи решаются так:

В mousePressEvent(QMouseEvent *e) проверяешь нажата ли левая кнопка мыши. Если да, то сохраняешь текущее положение курсора и устанавливаешь флаг, который будет указывать, что дальнейшее движение мыши надо обрабатывать как растяжение соответствующего квадрата.
В mouseMoveEvent(QMouseEvent *e) проверяешь флаг и если он установлен, то вычисляешь дистанцию которую прошла мышь от сохраненной позиции и в твоем случае прибавляешь его к соответствующей стороне квадрата.
В mouseReleaseEvent(QMouseEvent *e) если флаг установлен, то сбрасываешь его и если надо, то выполняешь действия необходимые для окончания процесса растяжения.

Если я правильно понял, то лучше будет наследовать свой класс от QGraphicsRectItem, переопределить в нем методы mousePressEvent, mouseMoveEvent, mouseReleaseEvent, paint и проверять в mousePressEvent находится ли мышь над гранью или над углом, а дальше примерно также, как и выше.

Или как вариант наследовать класс от QGraphicItem, который в свою очередь будет содержать 4 объекта класса, наследованных от QGraphicsLineItem и организовать процесс с помощью сигналов и слотов между этими объектами.
Смотря что хочешь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.4.2024, 13:40