QGraphicsScene и "резиновый" квадрат |
Здравствуйте, гость ( Вход | Регистрация )
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 |
из 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 и организовать процесс с помощью сигналов и слотов между этими объектами. Смотря что хочешь. |
|
|
Текстовая версия | Сейчас: 3.1.2025, 6:48 |