Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: li-frost от Март 15, 2011, 13:15



Название: Дорисовка QGraphicsItem
Отправлено: li-frost от Март 15, 2011, 13:15
Делаю растягивающийся квадрат. Решил унаследовать класс от QGraphicsObject:

вот .h файл
Код:
// Базовый класс
class WindowItem : public QGraphicsObject
{
public:
    WindowItem(QGraphicsItem *parent = 0);
};

// лева створка
class LeftGlume : public WindowItem
{
public:
    LeftGlume(QGraphicsItem *parent = 0);
    QRectF boundingRect() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);

};

// правая створка
class RightGlume : public WindowItem
{
public:
    RightGlume(QGraphicsItem *parent = 0);
    QRectF boundingRect() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);

protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *e);
    void mouseMoveEvent(QGraphicsSceneMouseEvent *e);

private:
    QPointF point;

public slots:
    void slot_resizeGlum();
};

// верхняя створка
class TopGlume : public WindowItem
{
public:
    TopGlume(QGraphicsItem *parent = 0);
    QRectF boundingRect() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
};

// нижняя створка
class BottomGlume : public WindowItem
{
public:
    BottomGlume(QGraphicsItem *parent = 0);
    QRectF boundingRect() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);

};

Вот .cpp
Код:
WindowItem::WindowItem(QGraphicsItem *parent) : QGraphicsObject(parent)
{
    setAcceptDrops(true);
}


// Левая створка
LeftGlume::LeftGlume(QGraphicsItem *parent) : WindowItem(parent)
{
}

QRectF LeftGlume::boundingRect() const
{
     return QRectF(100, 100, 20, 500);
}

void LeftGlume::paint(QPainter *painter,
           const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(option);
    Q_UNUSED(widget);

    painter->drawRect(100,100,20,500);
}


// Верхняя створка
TopGlume::TopGlume(QGraphicsItem *parent) : WindowItem(parent)
{
}

QRectF TopGlume::boundingRect() const
{
     return QRectF(100, 100, 500, 20);
}

void TopGlume::paint(QPainter *painter,
           const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(option);
    Q_UNUSED(widget);

    painter->drawRect(100,100,500,20);
}


// Нижняя створка
BottomGlume::BottomGlume(QGraphicsItem *parent) : WindowItem(parent)
{
}

QRectF BottomGlume::boundingRect() const
{
     return QRectF(100, 580, 500, 20);
}

void BottomGlume::paint(QPainter *painter,
           const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(option);
    Q_UNUSED(widget);

    painter->drawRect(100,580,500,20);
}


// Правая створка
RightGlume::RightGlume(QGraphicsItem *parent) : WindowItem(parent)
{
}

QRectF RightGlume::boundingRect() const
{
     return QRectF(580, 100, 20, 500);
}

void RightGlume::paint(QPainter *painter,
           const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(option);
    Q_UNUSED(widget);

    painter->drawRect(580,100,20,500);
}

void RightGlume::mousePressEvent(QGraphicsSceneMouseEvent *e)
{
    if(e->button() == Qt::LeftButton)
    {
        point = e->pos();
    }
}

void RightGlume::mouseMoveEvent(QGraphicsSceneMouseEvent *e)
{
    RightGlume *rightG = new RightGlume;

    int y;
    y = rightG->pos().y();

    setPos(e->scenePos().x() - point.x(), y);
    connect(rightG,SIGNAL(xChanged()),this,SLOT(slot_resizeGlum()));

    scene()->update(0,0,1000,1000);
}

В файле mainwinows.cpp создаю сцены и помещаю туда нарисованные итемы.
Я смог организовать перемещение правой створки квадрата, но как мне сделать, чтобы остальные дорисовывались по мере движение той или иной створки?!?!

P.S. может я ни тем путем пошел?


Название: Re: Дорисовка QGraphicsItem
Отправлено: alexman от Март 15, 2011, 13:24
Может стоит сделать все в одном айтеме?


Название: Re: Дорисовка QGraphicsItem
Отправлено: GreatSnake от Март 15, 2011, 13:35
Чего-то уж больно перемудрёно.
Как нимимум:
1. connect() нужно делать в конструкторе, т.к. при каждом движении мыши добавляется новый слот.
2. slot_resizeGlum() не реализован.
3. при изменении геометрии элемента апдейт всей сцены делать необязательно.

Цитировать
но как мне сделать, чтобы остальные дорисовывались по мере движение той или иной створки?!?
Ну а чего вы хотите, коли сделали обработку мышиных событий только для "правой створки"?


Название: Re: Дорисовка QGraphicsItem
Отправлено: li-frost от Март 15, 2011, 13:37
Слот забыл убрать....Я просто в нем пытался сделать дорисовку, но не получилось.


Название: Re: Дорисовка QGraphicsItem
Отправлено: li-frost от Март 15, 2011, 13:39
Может стоит сделать все в одном айтеме?
Если делать в одном, я не очень представляю себе как двигать его стенки (т.е. растягивая его).


Название: Re: Дорисовка QGraphicsItem
Отправлено: li-frost от Март 15, 2011, 13:43
Цитировать
Ну а чего вы хотите, коли сделали обработку мышиных событий только для "правой створки"?

А если не сложно то можно на примере, что именно нужно написать обрабатывая другие мышиные события для остальных створок?