crossplatform.ru

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

> QGraphicsRectItem и setPos()
lifrost
  опции профиля:
сообщение 10.3.2011, 11:48
Сообщение #1


Студент
*

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

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




Репутация:   0  


Создаю в конструкторе:

pRight = new QGraphicsRectItem;
pRight->setRect(580, 300, 20, 300);
pRight->setPen(QPen(Qt::black));
pRight->setBrush(QBrush(Qt::green));
addItem(pRight);


Хочу поменять положение своего rect, делаю следующее

void WindowScene::mousePressEvent(QGraphicsSceneMouseEvent *e)
{
    if(e->button() == Qt::LeftButton)
    {
        plastPos = pRight->scenePos();

        leftButton = true;
        mX = e->buttonDownScenePos(Qt::LeftButton).x();
    }
}

void WindowScene::mouseMoveEvent(QGraphicsSceneMouseEvent *e)
{
    int x, y;
    x = e->scenePos().x();
    y = e->scenePos().y();

    if(leftButton)
    {
        dx = x - mX;
        dy = plastPos.y();

        pRight->setPos(dx, dy);

        sceneUpdate();
    }
}

void WindowScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *e)
{
    e->accept();
    leftButton = false;
}


Квадрат перемещается, НО! Я не понимаю, почему при повторном перемещение он "соскакивает" в первоначальную позицию?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
abc
  опции профиля:
сообщение 15.3.2011, 13:31
Сообщение #2


Участник
**

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

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




Репутация:   4  


Вот код, двигающий левую и верхнюю грани... Надеюсь, он наставит тебя на путь...
Тебе не нужны ректитемы, достаточно в твоём классе нарисовать в paint() четыре линии. В маусэвенте изменять координаты вершин образовавшегося четырёхугольника

item.h
Раскрывающийся текст

class Item : public QGraphicsItem
{
public:
    Item();

    void paint ( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 );
    QRectF boundingRect () const;

    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    QPointF point;
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);

//вершины
    QPointF left_top;
    QPointF left_bottom;
    QPointF right_bottom;
    QPointF right_top;

};



item.cpp
Раскрывающийся текст

Item::Item()
{
    left_top=QPointF(0,0);
    left_bottom=QPointF(0,100);
    right_bottom=QPointF(100,100);
    right_top=QPointF(100,0);
}


void Item::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QLineF left_line(left_top,
                     left_bottom);
    painter->drawLine(left_line);

    QLineF bottom_line(left_bottom,
                       right_bottom);
    painter->drawLine(bottom_line);

    QLineF right_line(right_bottom,
                      right_top);
    painter->drawLine(right_line);

    QLineF top_line(right_top,
                     left_top);
    painter->drawLine(top_line);
}


QRectF Item::boundingRect() const        //область, ассоциируемая с итемом - в ней ловится мышь и рисует paint()
{
    return QRectF(-100,-100,200,200);
}


void Item::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    point=event->pos()-left_top;
//если уберёшь -left_top, будет прыгать в начальное значение на старте нового перетаскивания, как, кажется, было у тебя
}


void Item::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    left_top=event->pos()-point;
    update();
}



P.S. Когда хочешь показать большой код, оборачивай тег "код" в тег "раскрывающийся текст"

Сообщение отредактировал abc - 15.3.2011, 13:35
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lifrost
  опции профиля:
сообщение 15.3.2011, 14:51
Сообщение #3


Студент
*

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

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




Репутация:   0  


Цитата(abc @ 15.3.2011, 15:31) *
Вот код, двигающий левую и верхнюю грани... Надеюсь, он наставит тебя на путь...
Тебе не нужны ректитемы, достаточно в твоём классе нарисовать в paint() четыре линии. В маусэвенте изменять координаты вершин образовавшегося четырёхугольника

item.h
Раскрывающийся текст

class Item : public QGraphicsItem
{
public:
    Item();

    void paint ( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 );
    QRectF boundingRect () const;

    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    QPointF point;
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);

//вершины
    QPointF left_top;
    QPointF left_bottom;
    QPointF right_bottom;
    QPointF right_top;

};



item.cpp
Раскрывающийся текст

Item::Item()
{
    left_top=QPointF(0,0);
    left_bottom=QPointF(0,100);
    right_bottom=QPointF(100,100);
    right_top=QPointF(100,0);
}


void Item::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QLineF left_line(left_top,
                     left_bottom);
    painter->drawLine(left_line);

    QLineF bottom_line(left_bottom,
                       right_bottom);
    painter->drawLine(bottom_line);

    QLineF right_line(right_bottom,
                      right_top);
    painter->drawLine(right_line);

    QLineF top_line(right_top,
                     left_top);
    painter->drawLine(top_line);
}


QRectF Item::boundingRect() const        //область, ассоциируемая с итемом - в ней ловится мышь и рисует paint()
{
    return QRectF(-100,-100,200,200);
}


void Item::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    point=event->pos()-left_top;
//если уберёшь -left_top, будет прыгать в начальное значение на старте нового перетаскивания, как, кажется, было у тебя
}


void Item::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    left_top=event->pos()-point;
    update();
}



P.S. Когда хочешь показать большой код, оборачивай тег "код" в тег "раскрывающийся текст"



Круто! Я походу понял, спасибо большое!!!!
Тема закрыта.

P.S. на счет кода учту )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- lifrost   QGraphicsRectItem и setPos()   10.3.2011, 11:48
- - abc   держи код, который работает, но это в классе итема...   12.3.2011, 21:34
- - lifrost   спасибо, значит я просто пошел не той дорогой. у м...   14.3.2011, 7:51
- - lifrost   Я сделал, действительно итем двигается без проблем...   14.3.2011, 14:07
- - abc   Вот код, двигающий левую и верхнюю грани... Надеюс...   15.3.2011, 13:31
|- - lifrost   Цитата(abc @ 15.3.2011, 15:31) Вот код, д...   15.3.2011, 14:51
- - lifrost   Что-то после нескольких дней экспериментов я понял...   24.3.2011, 10:26
- - abc   что-то я не понял, какой результат нужно получить,...   24.3.2011, 12:31
|- - lifrost   Цитата(abc @ 24.3.2011, 14:31) что-то я н...   24.3.2011, 12:45
- - abc   IT Окна. Конструктор ? установил, не запускается -...   24.3.2011, 13:48
|- - lifrost   Цитата(abc @ 24.3.2011, 15:48) IT Окна. К...   24.3.2011, 14:00
- - abc   а, да, полигон для грани это выглядит хорошо, надо...   24.3.2011, 14:21
|- - lifrost   Цитата(abc @ 24.3.2011, 16:21) а, да, пол...   24.3.2011, 14:27
- - abc   пока не знаю, что сказать, нужно пробовать, завтр...   24.3.2011, 15:09
|- - lifrost   Цитата(abc @ 24.3.2011, 17:09) пока не зн...   25.3.2011, 9:51
- - lifrost   Я тут подумал....а QGraphicsItemGroup может как-ни...   25.3.2011, 10:47
- - abc   насколько я понимаю, раз это сделает итемы единым ...   25.3.2011, 13:35
|- - lifrost   Цитата(abc @ 25.3.2011, 15:35) насколько ...   25.3.2011, 13:41
- - abc   верю на слово ))   25.3.2011, 13:47
- - lifrost   Я тут ещё подумал, по мимо всего нужно ещё и разме...   25.3.2011, 15:26
- - abc   да, сетку неплохо бы ненавязчивую. чтоб такую прог...   25.3.2011, 16:18
- - Litkevich Yuriy   Цитата(abc @ 25.3.2011, 18:18) заархивиро...   26.3.2011, 7:38
- - abc   спасибо, Юра) квадрат адекватен, только если разд...   26.3.2011, 12:05
|- - lifrost   Цитата(abc @ 26.3.2011, 14:05) спасибо, Ю...   28.3.2011, 7:24
- - abc   я пытался добиться, чтобы, при раздвигании, грани ...   28.3.2011, 9:55
|- - lifrost   Цитата(abc @ 28.3.2011, 11:55) я пытался ...   28.3.2011, 10:31
- - abc   ИТ окна почти запустились - оказалось, что нужно б...   29.3.2011, 9:51
|- - lifrost   Цитата(abc @ 29.3.2011, 11:51) ИТ окна по...   29.3.2011, 10:34
- - abc   супер окна тоже не запускаются ставил бесплатную ...   29.3.2011, 20:19
|- - lifrost   Цитата(abc @ 29.3.2011, 22:19) супер окна...   30.3.2011, 9:28
- - lifrost   Кстати, есть ещё идея со сигналами/слотами...Это я...   30.3.2011, 9:59
- - abc   в реализации new Arс ты столкнулся с той же пробле...   30.3.2011, 11:49
|- - lifrost   Цитата(abc @ 30.3.2011, 13:49) в реализац...   31.3.2011, 7:09
- - abc   я проснулся ночью в поту! я полдня мучился, не...   31.3.2011, 9:57
|- - lifrost   Цитата(abc @ 31.3.2011, 11:57) я проснулс...   31.3.2011, 10:20
- - abc   2) задаёшь новые координаты вершин, затем устанавл...   31.3.2011, 11:43
|- - lifrost   Цитата(abc @ 31.3.2011, 13:43) 2) задаёшь...   1.4.2011, 7:33
- - abc   пусть двигается, но изначально строй окно по задан...   1.4.2011, 11:52
- - lifrost   Цитата(abc @ 1.4.2011, 13:52) пусть двига...   1.4.2011, 12:01


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


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




RSS Текстовая версия Сейчас: 29.11.2024, 15:18