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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: resize item'a с помощью маркеров  (Прочитано 10489 раз)
_OLEGator_
Гость
« Ответ #15 : Ноябрь 28, 2011, 09:23 »

Ясно.
Суть проектирования здесь остается та же - все общее для линий и прямоугольников - в базовый абстрактный класс, потом два наследника и реализация по максимуму общего функционала в них...
Записан
KontAr
Гость
« Ответ #16 : Ноябрь 29, 2011, 15:28 »

видимо все-таки плохо у меня с наследованием В замешательстве раз уж мне нужна только линия (уже хватит и ее), то может обойтись без абстрактных классов? не попадалось ли случайно примеров полилинии (что-то вроде артура, только с возможностью добавления узлов)?
Записан
KontAr
Гость
« Ответ #17 : Декабрь 10, 2011, 14:27 »

получилась у меня линия. и даже маркеры всё тянут, но появился эффект как в примере Path Stroking - маркеры срабатывают от щелчков, которые за километр от них самих. Может сталкивался кто с такой проблемой?
Код:
class ItemResize : public QGraphicsItem
{
public:
    ItemResize(int num) : QGraphicsItem()
    {
        setFlag(QGraphicsItem::ItemIgnoresTransformations, true);
        setZValue(1000);
        numPoint = num;
    }

        void setNumPoint(int position);
        int  getNumPoint() {return numPoint;}

protected:
        int numPoint;

        QRectF boundingRect() const
            {return QRectF(-4, -4, 8, 8);}

        void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
        {
            painter->save();
            painter->setBrush(Qt::red);
            painter->drawEllipse(-4, -4, 8, 8);
            painter->restore();
        }

//        QPainterPath shape() const
//        {
//            QPainterPath path;
//            path.addEllipse(-4, -4, 8, 8);
//            return path;
//        }
};
Записан
KontAr
Гость
« Ответ #18 : Декабрь 10, 2011, 17:37 »

в событии mousePressEvent  во view  я анализирую scene()->itemAt(mapToScene(event->pos())).
У маркеров значение Z = 1000, т.е. по любому щелчок мышки сначала попадет на него. Но срабатывают они даже если мыша на него не попала Грустный
Записан
steelvan
Гость
« Ответ #19 : Январь 07, 2012, 21:45 »

Получилось редактор сделать ?

У меня похожая задача. Интересно ?

http://www.forum.crossplatform.ru/index.php?showtopic=8082

Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #20 : Январь 12, 2012, 18:09 »

Держите класс для изменения размеров итемов и виджетов на сцене (позволяет перемещать прокси-виджеты на сцене).

пример использования для прокси-виджета (все лишнее повырезал)

Код:
#ifndef QMOVABLEGRAPHICSPROXYWIDGET_H
#define QMOVABLEGRAPHICSPROXYWIDGET_H

#include <QDomDocument>
#include <QDomElement>
#include <QGraphicsProxyWidget>
#include "crailobject.h"
#include "cresizer.h"
#include "qcommonrailitem.h"

class QMovableGraphicsProxyWidget : public QGraphicsProxyWidget,
                                    public QCommonRailItem,
                                    public CResizer
{
    Q_OBJECT

    void            onDrag(QPointF NewPosition); //при перетаскивании
    void            onResize(); //при изменении размера с помощью маркера
    void            updateAnchors(); //обновить изображение маркеров

protected:

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

    QRectF          boundingRect() const;
    void            paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    void            resizeEvent(QGraphicsSceneResizeEvent *event);
    QPainterPath    shape() const;
    void            focusInEvent(QFocusEvent *event);
    void            focusOutEvent(QFocusEvent *event);

public:
    explicit    QMovableGraphicsProxyWidget(QGraphicsItem * parent = 0, Qt::WindowFlags wFlags = 0);
    ~QMovableGraphicsProxyWidget();
    void        setWidget(QWidget *widget);

public  slots:

};


#endif // QMOVABLEGRAPHICSPROXYWIDGET_H

Код:
void    QMovableGraphicsProxyWidget::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
        if(work_state==wsEditing)
        {
            CResizer::mousePressEvent(event);
        }
        else
        if(event->button()==Qt::RightButton)
        {
            QGraphicsSceneContextMenuEvent cevent;
            cevent.setPos(event->pos());
            contextMenuEvent(&cevent);
        }
}

void    QMovableGraphicsProxyWidget::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    if(work_state==wsEditing)
    {
        CResizer::mouseMoveEvent(event,pos());
    }
    else
    QGraphicsProxyWidget::mouseMoveEvent(event);
}

QRectF    QMovableGraphicsProxyWidget::boundingRect() const
{
    QRectF  rect = QGraphicsProxyWidget::boundingRect();
    if(isSelected()) rect.adjust(-6,-6,6,6);
    return rect;
}

void    QMovableGraphicsProxyWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QGraphicsProxyWidget::paint(painter,option,widget);
    if((option->state & QStyle::State_Selected) && work_state == wsEditing)
    {
        CResizer::paint(painter,option,widget);
    }
}

QPainterPath    QMovableGraphicsProxyWidget::shape() const
{
    QPainterPath path;
    path.addRect(-6,-6,widget()->width()+12,widget()->height()+12);
    return path;
}

void    QMovableGraphicsProxyWidget::resizeEvent(QGraphicsSceneResizeEvent  * event)
{
    CResizer::setSize(event->newSize());
}

void    QMovableGraphicsProxyWidget::onDrag(QPointF NewPosition)
{
    setPos(NewPosition);
}

void    QMovableGraphicsProxyWidget::onResize()
{
    if(widget())
    {
        widget()->resize(qCeil(CResizer::size().width()),qCeil(CResizer::size().height()));
    }
    //setSize(CResizer::size());
}

void    QMovableGraphicsProxyWidget::updateAnchors()
{
    update();
}

void    QMovableGraphicsProxyWidget::setWidget(QWidget *widget)
{
    QGraphicsProxyWidget::setWidget(widget);
    if(widget)
    {
        CResizer::setSize(QSizeF(widget->size().width(),widget->size().height()));
    }
}

Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #21 : Январь 12, 2012, 18:11 »

класс немного недоработан, но основной функционал реализован - отображение маркеров, изменение размера итема при перетаскивании маркера, перетаскивание прокси-виджета (так как сама сцена этого почемуто не умеет)
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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