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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QGraphicsRectItem в QGraphicsScene  (Прочитано 4004 раз)
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, тогда при движении в другие стороны просто смещается начальная точка.
Записан
ammaximus
Гость
« Ответ #1 : Ноябрь 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. Прикрепляй дополнительно свой проект в архиве. Не у всех есть время вырезки допиливать.
« Последнее редактирование: Ноябрь 25, 2013, 14:51 от ammaximus » Записан
Achernar
Гость
« Ответ #2 : Ноябрь 25, 2013, 15:55 »

1. Делал уже и по двум точкам и находил длину и ширину отдельно тоже самое, при движении влево вверх верхний угол смещается туда же.
2. У меня это не функция.

Посмотрите проект в архиве.
Записан
ammaximus
Гость
« Ответ #3 : Ноябрь 26, 2013, 21:21 »

1. Ну мне особо добавить нечего. Вот переделал как и говорил. Многобукаф, поэтому не понятно че происходит, я тоже ничего не понял)) Просто переделал и все. Попробуй временно поудалять всю фигню из проекта - будет понятнее.
Записан
Achernar
Гость
« Ответ #4 : Ноябрь 28, 2013, 11:59 »

ammaximus, Спасибо огромное!

Просто надергал кода из разных примеров, буду разбираться.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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