-
UID:79354
-
- 注册时间2009-05-17
- 最后登录2018-11-12
- 在线时间327小时
-
- 发帖505
- 搜Ta的帖子
- 精华0
- 金钱4060
- 威望515
- 贡献值1
- 好评度506
-
访问TA的空间加好友用道具
|
在图形上面添加另外一个QGraphicsitem ,当修改这个图元的时候,去设置与它相关的图元的大小。 可以参考这个。。自已写的,如要有简单的方法,欢迎交流。。 - #include "stdafx.h"
- #include "cgKeyPointElement.h"
- #include "cgBaseElement.h"
- #include "cgScene.h"
- #include "cgRollingItem.h"
- cgKeyPointElement::cgKeyPointElement(cgBaseElement* item)
- :QGraphicsItem()
- {
- mItem = item;
- m_drag = false;
- m_moveID = 0;
- m_bHover = false;
- //悬浮设为TRUE
- setAcceptHoverEvents(true);
- //放到最底层
- //setZValue(-1);
- //初始化矩形的大小
- m_rect.setRect(0,0,0,0);
- hide();
- setFlag(QGraphicsItem::ItemIsMovable,true);
- setFlag(QGraphicsItem::ItemIsSelectable,false);
- }
- cgKeyPointElement::~cgKeyPointElement(void)
- {
- }
- QRectF cgKeyPointElement::boundingRect() const
- {
- return m_rect;
- }
- void cgKeyPointElement::paint(QPainter* viewPainter, const QStyleOptionGraphicsItem* option, QWidget* widget /*= 0*/)
- {
- if (!mItem)
- return;
- QRectF rect = m_rect;
- rect.adjust(5,5, -5, -5);
-
- viewPainter->setPen(QPen(Qt::yellow, 3, Qt::DotLine));
- viewPainter->setBrush(Qt::NoBrush);
- viewPainter->drawRect(rect);
- //绘制文字拖动点
- viewPainter->setPen(QPen(Qt::yellow, 0, Qt::SolidLine));
- if(m_bHover)
- {
- viewPainter->setBrush(QBrush(Qt::yellow,Qt::SolidPattern));
- //TopLeft
- viewPainter->drawRect(1,1,10,10);
- //TopCenter
- viewPainter->drawRect(m_rect.width()/2 - 6,1,10,10);
- //TopRight
- viewPainter->drawRect(m_rect.width()- 11,1,10,10);
- //BottomLeft
- viewPainter->drawRect(1,m_rect.height()- 11,10,10);
- //BottomCenter
- viewPainter->drawRect(m_rect.width()/2 - 6,m_rect.height()- 11,10,10);
- //LeftCenter
- viewPainter->drawRect(1,m_rect.height()/2 - 6,10,10);
- //RightCenter
- viewPainter->drawRect(m_rect.width()- 11,m_rect.height()/2 - 6,10,10);
- //BottomRight
- viewPainter->drawRect(m_rect.width()- 11,m_rect.height()- 11,10,10);
- switch(m_moveID)
- {
- case 1:
- {
- viewPainter->setBrush(QBrush(Qt::red,Qt::SolidPattern));
- //TopLeft
- viewPainter->drawRect(1,1,10,10);
- break;
- }
- case 2:
- {
- viewPainter->setBrush(QBrush(Qt::red,Qt::SolidPattern));
- //TopCenter
- viewPainter->drawRect(m_rect.width()/2 - 6,1,10,10);
- break;
- }
- case 3:
- {
- viewPainter->setBrush(QBrush(Qt::red,Qt::SolidPattern));
- //TopRight
- viewPainter->drawRect(m_rect.width()- 11,1,10,10);
- break;
- }
- case 4:
- {
- viewPainter->setBrush(QBrush(Qt::red,Qt::SolidPattern));
- //LeftCenter
- viewPainter->drawRect(1,m_rect.height()/2 - 6,10,10);
- break;
- }
- case 5:
- {
- viewPainter->setBrush(QBrush(Qt::red,Qt::SolidPattern));
- //RightCenter
- viewPainter->drawRect(m_rect.width()- 11,m_rect.height()/2 - 6,10,10);
- break;
- }
- case 6:
- {
- viewPainter->setBrush(QBrush(Qt::red,Qt::SolidPattern));
- //BottomLeft
- viewPainter->drawRect(1,m_rect.height()- 11,10,10);
- break;
- }
- case 7:
- {
- viewPainter->setBrush(QBrush(Qt::red,Qt::SolidPattern));
- //BottomCenter
- viewPainter->drawRect(m_rect.width()/2 - 6,m_rect.height()- 11,10,10);
- break;
- }
- case 8:
- {
- viewPainter->setBrush(QBrush(Qt::red,Qt::SolidPattern));
- //BottomRight
- viewPainter->drawRect(m_rect.width()- 11,m_rect.height()- 11,10,10);
- break;
- }
- default:
- viewPainter->setBrush(QBrush(Qt::yellow,Qt::SolidPattern));
- //TopLeft
- viewPainter->drawRect(1,1,10,10);
- //TopCenter
- viewPainter->drawRect(m_rect.width()/2 - 6,1,10,10);
- //TopRight
- viewPainter->drawRect(m_rect.width()- 11,1,10,10);
- //BottomLeft
- viewPainter->drawRect(1,m_rect.height()- 11,10,10);
- //BottomCenter
- viewPainter->drawRect(m_rect.width()/2 - 6,m_rect.height()- 11,10,10);
- //LeftCenter
- viewPainter->drawRect(1,m_rect.height()/2 - 6,10,10);
- //RightCenter
- viewPainter->drawRect(m_rect.width()- 11,m_rect.height()/2 - 6,10,10);
- //BottomRight
- viewPainter->drawRect(m_rect.width()- 11,m_rect.height()- 11,10,10);
- }//End switch
- }//END IF
- else
- {
- viewPainter->setBrush(QBrush(Qt::yellow,Qt::SolidPattern));
- //TopLeft
- viewPainter->drawRect(1,1,10,10);
- //TopCenter
- viewPainter->drawRect(m_rect.width()/2 - 6,1,10,10);
- //TopRight
- viewPainter->drawRect(m_rect.width()- 11,1,10,10);
- //BottomLeft
- viewPainter->drawRect(1,m_rect.height()- 11,10,10);
- //BottomCenter
- viewPainter->drawRect(m_rect.width()/2 - 6,m_rect.height()- 11,10,10);
- //LeftCenter
- viewPainter->drawRect(1,m_rect.height()/2 - 6,10,10);
- //RightCenter
- viewPainter->drawRect(m_rect.width()- 11,m_rect.height()/2 - 6,10,10);
- //BottomRight
- viewPainter->drawRect(m_rect.width()- 11,m_rect.height()- 11,10,10);
- }
- }
- void cgKeyPointElement::mousePressEvent ( QGraphicsSceneMouseEvent * ev)
- {
- m_lastPos = ev->pos();
- mOldRect = m_rect;
- QGraphicsItem * item = dynamic_cast<QGraphicsItem *>(mItem);
- if (item)
- item->setSelected(true);
- QGraphicsItem::mousePressEvent(ev);
- }
- void cgKeyPointElement::mouseMoveEvent ( QGraphicsSceneMouseEvent * ev)
- {
- QPointF now_pos = ev->pos();
- QPointF item_pos = pos();
- int w_offset = now_pos.x() - m_lastPos.x();
- int h_offset = now_pos.y() - m_lastPos.y();
- if(m_drag)
- {
- switch(m_moveID)
- {
- case 1:
- prepareGeometryChange();
- m_rect.setWidth(m_rect.width() - w_offset);
- m_rect.setHeight(m_rect.height() - h_offset);
- setPos(item_pos + QPointF(w_offset,h_offset));
- break;
- case 2:
- prepareGeometryChange();
- m_rect.setHeight(m_rect.height() - h_offset);
- setPos(item_pos+QPointF(0,h_offset));
- break;
- case 3:
- prepareGeometryChange();
- m_rect.setWidth(now_pos.x());
- m_rect.setHeight(m_rect.height() - h_offset);
- setPos(item_pos+QPointF(0,h_offset));
- break;
- case 4:
- m_rect.setWidth(m_rect.width() - w_offset);
- setPos(item_pos+QPointF(w_offset,0));
- break;
- case 5:
- prepareGeometryChange();
- m_rect.setWidth(now_pos.x());
- break;
- case 6:
- prepareGeometryChange();
- m_rect.setWidth(m_rect.width() - w_offset);
- m_rect.setHeight(now_pos.y());
- setPos(item_pos + QPointF(w_offset,0));
- break;
- case 7:
- prepareGeometryChange();
- m_rect.setHeight(now_pos.y());
- break;
- case 8:
- prepareGeometryChange();
- m_rect.setWidth(now_pos.x());
- m_rect.setHeight(now_pos.y());
- break;
- default:
- QGraphicsItem::mouseMoveEvent(ev);
- break;
- }
- }
- else
- {
- mItem->setMoving(true);
- QGraphicsItem::mouseMoveEvent(ev);
- }
- }
- void cgKeyPointElement::mouseReleaseEvent ( QGraphicsSceneMouseEvent * ev)
- {
- QPointF now_pos = ev->pos();
- qreal width_offset = m_rect.width() - mOldRect.width();
- qreal height_offset = m_rect.height() - mOldRect.height();
- qreal scaleWidth = 1.0;
- qreal scaleHeight = 1.0;
- QGraphicsItem * item = dynamic_cast<QGraphicsItem *>(mItem);
- if(m_drag)
- {
- // 获取到最原始的放大倍数
- QRectF rect = item->boundingRect();
- if (mItem)
- {
- // 设置放大倍数
- mItem->setRect(QRectF(0, 0, m_rect.width(), m_rect.height()));
- }
- }
- if (item)
- {
- mItem->setMoving(false);
- item->setPos(this->pos());
- }
- QGraphicsItem::mouseReleaseEvent(ev);
- m_drag = false;
- }
- void cgKeyPointElement::hoverMoveEvent(QGraphicsSceneHoverEvent * ev)
- {
- QPointF m_hoverPos = ev->pos();
- qreal Rect_W = m_rect.width();
- qreal Rect_W2 = m_rect.width()/2;
- qreal Rect_H = m_rect.height();
- qreal Rect_H2 = m_rect.height()/2;
- int halfDis = 15;
- int distance = 20;
- if(((Rect_W2 - halfDis) < m_hoverPos.x() && m_hoverPos.x() < (Rect_W2 + halfDis))&&
- ((Rect_H - distance) < m_hoverPos.y() && m_hoverPos.y() < (Rect_H + distance)))
- {
- //BottomCenter
- setCursor(Qt::SizeVerCursor);
- m_moveID = 7;
- m_bHover = true;
- m_drag = true;
- }
- else if(((Rect_W2 - halfDis) < m_hoverPos.x() && m_hoverPos.x() < (Rect_W2 + halfDis))&&
- (- distance < m_hoverPos.y() && m_hoverPos.y() < distance))
- {
- //TopCenter
- setCursor(Qt::SizeVerCursor);
- m_moveID = 2;
- m_bHover = true;
- m_drag = true;
- }
- else if(((Rect_W - distance) < m_hoverPos.x() && m_hoverPos.x() < (Rect_W + distance))&&
- (- distance < m_hoverPos.y() && m_hoverPos.y() < distance))
- {
- //TopRight
- setCursor(Qt::SizeBDiagCursor);
- m_moveID = 3;
- m_bHover = true;
- m_drag = true;
- }
- else if((- distance < m_hoverPos.x() && m_hoverPos.x() < distance)&&
- (- distance < m_hoverPos.y() && m_hoverPos.y() < distance))
- {
- //TopLeft
- setCursor(Qt::SizeFDiagCursor);
- m_moveID = 1;
- m_bHover = true;
- m_drag = true;
- }
- else if(((Rect_W - distance) < m_hoverPos.x() && m_hoverPos.x() < (Rect_W + distance))&&
- ((Rect_H - distance) < m_hoverPos.y() && m_hoverPos.y() < (Rect_H + distance)))
- {
- //BottomRight
- setCursor(Qt::SizeFDiagCursor);
- m_moveID = 8;
- m_bHover = true;
- m_drag = true;
- }
- else if(((- distance < m_hoverPos.x() && m_hoverPos.x() < distance))&&
- ((Rect_H - distance) < m_hoverPos.y() && m_hoverPos.y() < (Rect_H + distance)))
- {
- //BottomLeft
- setCursor(Qt::SizeBDiagCursor);
- m_moveID = 6;
- m_bHover = true;
- m_drag = true;
- }
- else if(((Rect_W - distance) < m_hoverPos.x() && m_hoverPos.x() < (Rect_W + distance))&&
- ((Rect_H2 - halfDis) < m_hoverPos.y() && m_hoverPos.y() < (Rect_H2 + halfDis)))
- {
- //RightCenter
- setCursor(Qt::SizeHorCursor);
- m_moveID = 5;
- m_bHover = true;
- m_drag = true;
- }
- else if(((- distance < m_hoverPos.x() && m_hoverPos.x() < distance))&&
- ((Rect_H2 - halfDis) < m_hoverPos.y() && m_hoverPos.y() < (Rect_H2 + halfDis)))
- {
- //LeftCenter
- setCursor(Qt::SizeHorCursor);
- m_moveID = 4;
- m_bHover = true;
- m_drag = true;
- }
- else
- {
- //Revert
- setCursor(Qt::ArrowCursor);
- m_moveID = 0;
- m_bHover = false;
- m_drag = false;
- }
- update();
- QGraphicsItem::hoverMoveEvent(ev);
- }
- void cgKeyPointElement::hoverLeaveEvent ( QGraphicsSceneHoverEvent * ev)
- {
- m_bHover = false;
- QGraphicsItem::hoverLeaveEvent(ev);
- }
- void cgKeyPointElement::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *ev)
- {
- hide();
- QGraphicsItem::mouseDoubleClickEvent(ev);
- }
- void cgKeyPointElement::setBoundingRect(QRectF rect)
- {
- prepareGeometryChange();
- m_rect = rect;
- }
|