Название: Дорисовка 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
Ну а чего вы хотите, коли сделали обработку мышиных событий только для "правой створки"? А если не сложно то можно на примере, что именно нужно написать обрабатывая другие мышиные события для остальных створок?
|