Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Sahab от Декабрь 21, 2010, 18:17



Название: Resize QGraphicsItem
Отправлено: Sahab от Декабрь 21, 2010, 18:17
Кто-нибудь делал сабж?
Интересуют мысли по программному ресайзу различных QGraphicsItem`ов... (QGraphicsTextItem, QGraphicsSvgItem etc.)


Название: Re: Resize QGraphicsItem
Отправлено: ufna от Декабрь 22, 2010, 23:02
Если как здесь (http://novabook.ru) устроит, то расскажу. (там то ли при контроле, то ли при шифте зажатом мышью двигать надо, не помню)


Название: Re: Resize QGraphicsItem
Отправлено: alexman от Декабрь 22, 2010, 23:06
А в чем проблема ??? Меняешь данные и, если меняется bounding rect, то вызываешь void QGraphicsItem::prepareGeometryChange ().


Название: Re: Resize QGraphicsItem
Отправлено: Sahab от Март 11, 2011, 10:38
пример в студию plz.


Название: Re: Resize QGraphicsItem
Отправлено: alexman от Март 11, 2011, 12:54
Из Qt Assistant ;)
Код:
 void CircleItem::setRadius(qreal newRadius)
 {
     if (radius != newRadius) {
         prepareGeometryChange();
         radius = newRadius;
     }
 }


Название: Re: Resize QGraphicsItem
Отправлено: romanick от Март 21, 2011, 20:32
Тянем за границу QGraphicsRectItem:

Делаем наследника от QGraphicsRectItem, пусть он будет называться text_rect_item
Код:
// в .h
enum resize_direction
{
    rd_none,
    rd_left,
    rd_top,
    rd_right,
    rd_bottom
};
// добавляем в private:
resize_direction resize_direction_;

// в .cpp
void text_rect_item::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    QPointF p = event->pos();

    QRectF r = sceneBoundingRect(); // relative to scene
    QPointF tl = mapFromScene(r.topLeft());
    QPointF br = mapFromScene(r.bottomRight());
    if (p.x() <= tl.x()+3)
        resize_direction_ = rd_left;
    else if (p.x() >= br.x()-3)
        resize_direction_ = rd_right;
    else if (p.y() <= tl.y()+3)
        resize_direction_ = rd_top;
    else if (p.y() >= br.y()-3)
        resize_direction_ = rd_bottom;
    else
        resize_direction_ = rd_none;

    QGraphicsRectItem::mousePressEvent(event);
}

void text_rect_item::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    was_moved_ = true;
    if (isSelected())
    {
        // resize border to mouse position
        QPointF p = event->pos();
        QPointF pp = mapToItem(this, p);
        QRectF r = rect();
        switch (resize_direction_)
        {
        case rd_left:
            r.setLeft(pp.x());
            setRect(r);
            break;
        case rd_top:
            r.setTop(pp.y());
            setRect(r);
            break;
        case rd_right:
            r.setRight(pp.x());
            setRect(r);
            break;
        case rd_bottom:
            r.setBottom(pp.y());
            setRect(r);
            break;
        default:
            QGraphicsRectItem::mouseMoveEvent(event);
            break;
        }
        return; // это главное, иначе item будет просто перемещаться вслед за курсором
    }
    QGraphicsRectItem::mouseMoveEvent(event);
}

если надо чтобы  менялся курсор на границе, то переопределяем в наследнике QGraphicsView метод mouseMoveEvent

Код:
void page_view::mouseMoveEvent(QMouseEvent *event)
{
    QGraphicsView::mouseMoveEvent(event);
    QGraphicsItem* item = itemAt(event->pos());
    if (item==0)
        return;
    QPointF p = event->pos(); // relative to page-view
    QRectF r = item->sceneBoundingRect(); // relative to scene
    QPointF tl = mapFromScene(r.topLeft());
    QPointF br = mapFromScene(r.bottomRight());

    if (p.x() <= tl.x()+3 || p.x() >= br.x()-3)
        item->setCursor(Qt::SizeHorCursor);
    else if (p.y() <= tl.y()+3 || p.y() >= br.y()-3)
        item->setCursor(Qt::SizeVerCursor);
    else
        item->setCursor(Qt::SizeAllCursor);
}


Название: Re: Resize QGraphicsItem
Отправлено: GreatSnake от Март 22, 2011, 12:24
Цитировать
переопределяем в наследнике QGraphicsView метод mouseMoveEvent
А чем не устроил QGraphicsItem::mouseMoveEvent() коли перегрузил QGraphicsItem::mousePressEvent()?


Название: Re: Resize QGraphicsItem
Отправлено: romanick от Март 26, 2011, 12:57
Цитировать
переопределяем в наследнике QGraphicsView метод mouseMoveEvent
А чем не устроил QGraphicsItem::mouseMoveEvent() коли перегрузил QGraphicsItem::mousePressEvent()?

Как показала практика
QGraphicsItem::mouseMoveEvent() вызывается только когда тянешь за элемент.
QGraphicsView::mouseMoveEvent() вызывается при любом перемещении мыши над view.