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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Дорисовка QGraphicsItem  (Прочитано 3735 раз)
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. может я ни тем путем пошел?
Записан
alexman
Гость
« Ответ #1 : Март 15, 2011, 13:24 »

Может стоит сделать все в одном айтеме?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #2 : Март 15, 2011, 13:35 »

Чего-то уж больно перемудрёно.
Как нимимум:
1. connect() нужно делать в конструкторе, т.к. при каждом движении мыши добавляется новый слот.
2. slot_resizeGlum() не реализован.
3. при изменении геометрии элемента апдейт всей сцены делать необязательно.

Цитировать
но как мне сделать, чтобы остальные дорисовывались по мере движение той или иной створки?!?
Ну а чего вы хотите, коли сделали обработку мышиных событий только для "правой створки"?
« Последнее редактирование: Март 15, 2011, 13:37 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
li-frost
Гость
« Ответ #3 : Март 15, 2011, 13:37 »

Слот забыл убрать....Я просто в нем пытался сделать дорисовку, но не получилось.
Записан
li-frost
Гость
« Ответ #4 : Март 15, 2011, 13:39 »

Может стоит сделать все в одном айтеме?
Если делать в одном, я не очень представляю себе как двигать его стенки (т.е. растягивая его).
Записан
li-frost
Гость
« Ответ #5 : Март 15, 2011, 13:43 »

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

А если не сложно то можно на примере, что именно нужно написать обрабатывая другие мышиные события для остальных створок?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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