Название: QGraphicsRectItem в QGraphicsScene
Отправлено: Achernar от Ноябрь 25, 2013, 00:21
Здравствуйте! void DrawBox::mousePressEvent(QGraphicsSceneMouseEvent *me) { if (me->button() != Qt::LeftButton) return; switch(myMode) { case free: QGraphicsScene::mousePressEvent(me); break; case fPoint: if(myType == ellipse) { QGraphicsEllipseItem *ellip; ellip = new QGraphicsEllipseItem; ellip->setRect(QRectF(me->scenePos(), me->scenePos())); ellip->setPen(QPen(Qt::red, 5, Qt::DashDotLine, Qt::RoundCap, Qt::RoundJoin)); addItem(ellip); myMode = sPoint; } else if(myType == rectangle) { QGraphicsRectItem *rectn; rectn = new QGraphicsRectItem; rectn->setRect(QRectF(me->scenePos(), me->scenePos())); rectn->setPen(QPen(Qt::red, 5, Qt::DashDotLine, Qt::RoundCap, Qt::RoundJoin)); addItem(rectn); myMode = sPoint; } else if(myType == line) { QGraphicsLineItem *line; line = new QGraphicsLineItem; line->setLine(QLineF(me->scenePos(), me->scenePos())); line->setPen(QPen(Qt::red, 5, Qt::DashDotLine, Qt::RoundCap, Qt::RoundJoin)); addItem(line); myMode = sPoint; } break; case sPoint: break; } } void DrawBox::mouseReleaseEvent(QGraphicsSceneMouseEvent *me) { if (me->button() != Qt::LeftButton) return; switch(myMode) { case free: QGraphicsScene::mouseReleaseEvent(me); break; case fPoint: myMode = free; break; case sPoint: if(myType == ellipse) { QGraphicsEllipseItem *ellip; ellip = static_cast<QGraphicsEllipseItem *>(items().first()); ellip->setPen(pen); ellip->setBrush(brush); ellip->setRect(QRectF(ellip->rect().topLeft(), me->scenePos())); myMode = free; } else if(myType == rectangle) { QGraphicsRectItem *rectn; rectn = static_cast<QGraphicsRectItem *>(items().first()); rectn->setPen(pen); rectn->setBrush(brush); rectn->setRect(QRectF(rectn->rect().topLeft(), me->scenePos())); myMode = free; } else if(myType == line) { QGraphicsLineItem *line; line = static_cast<QGraphicsLineItem *>(items().first()); line->setPen(pen); line->setLine(QLineF(line->line().p1(), me->scenePos())); myMode = free; } break; } } void DrawBox::mouseMoveEvent(QGraphicsSceneMouseEvent *me) { switch(myMode) { case free: QGraphicsScene::mouseMoveEvent(me); break; case fPoint: break; case sPoint: if(myType == ellipse) { QGraphicsEllipseItem *ellip = static_cast<QGraphicsEllipseItem *>(items().first()); ellip->setRect(QRectF(ellip->rect().topLeft(), me->scenePos())); } else if(myType == rectangle) { QGraphicsRectItem *rectn = static_cast<QGraphicsRectItem *>(items().first()); rectn->setRect(QRectF(rectn->rect().topLeft(), me->scenePos())); } else if(myType == line) { QGraphicsLineItem *line = static_cast<QGraphicsLineItem *>(items().first()); line->setLine(QLineF(line->line().p1(), me->scenePos())); } break; } }
Хочу реализовать следущее поведение в GraphicsScene: при нажатии левой кнопки мыши создается Item, при движении с зажатой кнопкой - растянуть от начальной точки до текущей точки, и при отпускании кнопки - фиксировать Item. В случае с эллипсом и линией работает как надо, а в случае с прямоугольником работает в случае растягивания вправо и вниз, а в другие стороны не работает. Пробовал использовать normalize, тогда при движении в другие стороны просто смещается начальная точка.
Название: Re: QGraphicsRectItem в QGraphicsScene
Отправлено: ammaximus от Ноябрь 25, 2013, 14:48
1. QRect не имеет конструктора (какая-та точка, какая-то точка). Ты должен давать левую верхнюю, затем нижнюю правую. Заведи переменную QPoint и храни в ней исходное положение(p1). Конечное положение - это текущее положение мыши(p2). Левый верхний это QPoint(p1.x<p2.x?p1.x:p2.x,p1.y<p2.y?p1.y:p2.y); 2. free - это функция stdlib.
Просто эллипс поддерживает неправильные ректанглы, наверное у него формула не зависит от знака. Rectangle скорее всего сгорает на boundingRect. Ну короче переделай. Брать рект последнего добавленного в сцену элемента это не лучший подход, не факт, что это тот элемент, который ты создал мышью. p.s. Правый нижний то же выражение, только знаки в другую сторону. Или можно найти длину ширину вместо этого. p.p.s. Прикрепляй дополнительно свой проект в архиве. Не у всех есть время вырезки допиливать.
Название: Re: QGraphicsRectItem в QGraphicsScene
Отправлено: Achernar от Ноябрь 25, 2013, 15:55
1. Делал уже и по двум точкам и находил длину и ширину отдельно тоже самое, при движении влево вверх верхний угол смещается туда же. 2. У меня это не функция.
Посмотрите проект в архиве.
Название: Re: QGraphicsRectItem в QGraphicsScene
Отправлено: ammaximus от Ноябрь 26, 2013, 21:21
1. Ну мне особо добавить нечего. Вот переделал как и говорил. Многобукаф, поэтому не понятно че происходит, я тоже ничего не понял)) Просто переделал и все. Попробуй временно поудалять всю фигню из проекта - будет понятнее.
Название: Re: QGraphicsRectItem в QGraphicsScene
Отправлено: Achernar от Ноябрь 28, 2013, 11:59
ammaximus, Спасибо огромное!
Просто надергал кода из разных примеров, буду разбираться.
|