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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Resize QGraphicsItem  (Прочитано 9665 раз)
Sahab
Гость
« : Декабрь 21, 2010, 18:17 »

Кто-нибудь делал сабж?
Интересуют мысли по программному ресайзу различных QGraphicsItem`ов... (QGraphicsTextItem, QGraphicsSvgItem etc.)
« Последнее редактирование: Декабрь 22, 2010, 02:23 от Sahab » Записан
ufna
Гость
« Ответ #1 : Декабрь 22, 2010, 23:02 »

Если как здесь устроит, то расскажу. (там то ли при контроле, то ли при шифте зажатом мышью двигать надо, не помню)
Записан
alexman
Гость
« Ответ #2 : Декабрь 22, 2010, 23:06 »

А в чем проблема Непонимающий Меняешь данные и, если меняется bounding rect, то вызываешь void QGraphicsItem::prepareGeometryChange ().
Записан
Sahab
Гость
« Ответ #3 : Март 11, 2011, 10:38 »

пример в студию plz.
Записан
alexman
Гость
« Ответ #4 : Март 11, 2011, 12:54 »

Из Qt Assistant Подмигивающий
Код:
 void CircleItem::setRadius(qreal newRadius)
 {
     if (radius != newRadius) {
         prepareGeometryChange();
         radius = newRadius;
     }
 }
Записан
romanick
Гость
« Ответ #5 : Март 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);
}
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Март 22, 2011, 12:24 »

Цитировать
переопределяем в наследнике QGraphicsView метод mouseMoveEvent
А чем не устроил QGraphicsItem::mouseMoveEvent() коли перегрузил QGraphicsItem::mousePressEvent()?
Записан

Qt 5.11/4.8.7 (X11/Win)
romanick
Гость
« Ответ #7 : Март 26, 2011, 12:57 »

Цитировать
переопределяем в наследнике QGraphicsView метод mouseMoveEvent
А чем не устроил QGraphicsItem::mouseMoveEvent() коли перегрузил QGraphicsItem::mousePressEvent()?

Как показала практика
QGraphicsItem::mouseMoveEvent() вызывается только когда тянешь за элемент.
QGraphicsView::mouseMoveEvent() вызывается при любом перемещении мыши над view.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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