- 
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;
 - }
 
  
 
 
 |