• 10438阅读
  • 6回复

QGraphicsItem 怎么才能让它有拖动边框缩放图形的功能 [复制链接]

上一主题 下一主题
离线longwenbiao
 
只看楼主 正序阅读 楼主  发表于: 2009-11-26
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
请参考一下qtdemo上的列子:Graphics View 上 Diagram Scene,在这里面只能选择,拖动图形,边框并不能被选中,我想让边框能选中来缩放大小,并且还能选中里面的图形进行修改? 

离线babybluema

只看该作者 6楼 发表于: 2010-03-18
同问,组合图形该怎么处理拖动边框缩放图形功能
离线penghoujia

只看该作者 5楼 发表于: 2009-12-02
如果是组合图形需要放大和缩小那怎么做呢,
离线longwenbiao
只看该作者 4楼 发表于: 2009-11-26
非常感谢,我研究下
离线robertkun

只看该作者 3楼 发表于: 2009-11-26
在图形上面添加另外一个QGraphicsitem ,当修改这个图元的时候,去设置与它相关的图元的大小。
可以参考这个。。自已写的,如要有简单的方法,欢迎交流。。

  1. #include "stdafx.h"
  2. #include "cgKeyPointElement.h"
  3. #include "cgBaseElement.h"
  4. #include "cgScene.h"
  5. #include "cgRollingItem.h"
  6. cgKeyPointElement::cgKeyPointElement(cgBaseElement* item)
  7. :QGraphicsItem()
  8. {
  9.     mItem = item;
  10.     m_drag = false;
  11.     m_moveID = 0;
  12.     m_bHover = false;
  13.     //悬浮设为TRUE
  14.     setAcceptHoverEvents(true);
  15.     //放到最底层
  16.     //setZValue(-1);
  17.     //初始化矩形的大小
  18.     m_rect.setRect(0,0,0,0);
  19.     hide();
  20.     setFlag(QGraphicsItem::ItemIsMovable,true);
  21.     setFlag(QGraphicsItem::ItemIsSelectable,false);
  22. }
  23. cgKeyPointElement::~cgKeyPointElement(void)
  24. {
  25. }
  26. QRectF cgKeyPointElement::boundingRect() const
  27. {
  28.     return m_rect;
  29. }
  30. void cgKeyPointElement::paint(QPainter* viewPainter, const QStyleOptionGraphicsItem* option, QWidget* widget /*= 0*/)
  31. {
  32.     if (!mItem)
  33.         return;
  34.     QRectF rect = m_rect;
  35.     rect.adjust(5,5, -5, -5);
  36.     
  37.     viewPainter->setPen(QPen(Qt::yellow, 3, Qt::DotLine));
  38.     viewPainter->setBrush(Qt::NoBrush);
  39.     viewPainter->drawRect(rect);
  40.     //绘制文字拖动点
  41.     viewPainter->setPen(QPen(Qt::yellow, 0, Qt::SolidLine));
  42.     if(m_bHover)
  43.     {
  44.         viewPainter->setBrush(QBrush(Qt::yellow,Qt::SolidPattern));
  45.         //TopLeft
  46.         viewPainter->drawRect(1,1,10,10);
  47.         //TopCenter
  48.         viewPainter->drawRect(m_rect.width()/2 - 6,1,10,10);
  49.         //TopRight
  50.         viewPainter->drawRect(m_rect.width()- 11,1,10,10);
  51.         //BottomLeft
  52.         viewPainter->drawRect(1,m_rect.height()- 11,10,10);
  53.         //BottomCenter
  54.         viewPainter->drawRect(m_rect.width()/2 - 6,m_rect.height()- 11,10,10);
  55.         //LeftCenter
  56.         viewPainter->drawRect(1,m_rect.height()/2 - 6,10,10);
  57.         //RightCenter
  58.         viewPainter->drawRect(m_rect.width()- 11,m_rect.height()/2 - 6,10,10);
  59.         //BottomRight
  60.         viewPainter->drawRect(m_rect.width()- 11,m_rect.height()- 11,10,10);
  61.         switch(m_moveID)
  62.         {
  63.         case 1:
  64.             {
  65.                 viewPainter->setBrush(QBrush(Qt::red,Qt::SolidPattern));
  66.                 //TopLeft
  67.                 viewPainter->drawRect(1,1,10,10);
  68.                 break;
  69.             }
  70.         case 2:
  71.             {
  72.                 viewPainter->setBrush(QBrush(Qt::red,Qt::SolidPattern));
  73.                 //TopCenter
  74.                 viewPainter->drawRect(m_rect.width()/2 - 6,1,10,10);
  75.                 break;
  76.             }
  77.         case 3:
  78.             {
  79.                 viewPainter->setBrush(QBrush(Qt::red,Qt::SolidPattern));
  80.                 //TopRight
  81.                 viewPainter->drawRect(m_rect.width()- 11,1,10,10);
  82.                 break;
  83.             }
  84.         case 4:
  85.             {
  86.                 viewPainter->setBrush(QBrush(Qt::red,Qt::SolidPattern));
  87.                 //LeftCenter
  88.                 viewPainter->drawRect(1,m_rect.height()/2 - 6,10,10);
  89.                 break;
  90.             }
  91.         case 5:
  92.             {
  93.                 viewPainter->setBrush(QBrush(Qt::red,Qt::SolidPattern));
  94.                 //RightCenter
  95.                 viewPainter->drawRect(m_rect.width()- 11,m_rect.height()/2 - 6,10,10);
  96.                 break;
  97.             }
  98.         case 6:
  99.             {
  100.                 viewPainter->setBrush(QBrush(Qt::red,Qt::SolidPattern));
  101.                 //BottomLeft
  102.                 viewPainter->drawRect(1,m_rect.height()- 11,10,10);
  103.                 break;
  104.             }
  105.         case 7:
  106.             {
  107.                 viewPainter->setBrush(QBrush(Qt::red,Qt::SolidPattern));
  108.                 //BottomCenter
  109.                 viewPainter->drawRect(m_rect.width()/2 - 6,m_rect.height()- 11,10,10);
  110.                 break;
  111.             }
  112.         case 8:
  113.             {
  114.                 viewPainter->setBrush(QBrush(Qt::red,Qt::SolidPattern));
  115.                 //BottomRight
  116.                 viewPainter->drawRect(m_rect.width()- 11,m_rect.height()- 11,10,10);
  117.                 break;
  118.             }
  119.         default:
  120.             viewPainter->setBrush(QBrush(Qt::yellow,Qt::SolidPattern));
  121.             //TopLeft
  122.             viewPainter->drawRect(1,1,10,10);
  123.             //TopCenter
  124.             viewPainter->drawRect(m_rect.width()/2 - 6,1,10,10);
  125.             //TopRight
  126.             viewPainter->drawRect(m_rect.width()- 11,1,10,10);
  127.             //BottomLeft
  128.             viewPainter->drawRect(1,m_rect.height()- 11,10,10);
  129.             //BottomCenter
  130.             viewPainter->drawRect(m_rect.width()/2 - 6,m_rect.height()- 11,10,10);
  131.             //LeftCenter
  132.             viewPainter->drawRect(1,m_rect.height()/2 - 6,10,10);
  133.             //RightCenter
  134.             viewPainter->drawRect(m_rect.width()- 11,m_rect.height()/2 - 6,10,10);
  135.             //BottomRight
  136.             viewPainter->drawRect(m_rect.width()- 11,m_rect.height()- 11,10,10);
  137.         }//End switch
  138.     }//END IF
  139.     else
  140.     {
  141.         viewPainter->setBrush(QBrush(Qt::yellow,Qt::SolidPattern));
  142.         //TopLeft
  143.         viewPainter->drawRect(1,1,10,10);
  144.         //TopCenter
  145.         viewPainter->drawRect(m_rect.width()/2 - 6,1,10,10);
  146.         //TopRight
  147.         viewPainter->drawRect(m_rect.width()- 11,1,10,10);
  148.         //BottomLeft
  149.         viewPainter->drawRect(1,m_rect.height()- 11,10,10);
  150.         //BottomCenter
  151.         viewPainter->drawRect(m_rect.width()/2 - 6,m_rect.height()- 11,10,10);
  152.         //LeftCenter
  153.         viewPainter->drawRect(1,m_rect.height()/2 - 6,10,10);
  154.         //RightCenter
  155.         viewPainter->drawRect(m_rect.width()- 11,m_rect.height()/2 - 6,10,10);
  156.         //BottomRight
  157.         viewPainter->drawRect(m_rect.width()- 11,m_rect.height()- 11,10,10);
  158.     }
  159. }    
  160. void cgKeyPointElement::mousePressEvent ( QGraphicsSceneMouseEvent * ev)
  161. {
  162.     m_lastPos = ev->pos();
  163.     mOldRect = m_rect;
  164.     QGraphicsItem * item = dynamic_cast<QGraphicsItem *>(mItem);
  165.     if (item)
  166.         item->setSelected(true);
  167.     QGraphicsItem::mousePressEvent(ev);
  168. }
  169. void cgKeyPointElement::mouseMoveEvent ( QGraphicsSceneMouseEvent * ev)
  170. {
  171.     QPointF now_pos = ev->pos();
  172.     QPointF item_pos = pos();
  173.     int w_offset = now_pos.x() - m_lastPos.x();
  174.     int h_offset = now_pos.y() - m_lastPos.y();
  175.     if(m_drag)
  176.     {
  177.         switch(m_moveID)
  178.         {
  179.         case 1:
  180.             prepareGeometryChange();
  181.             m_rect.setWidth(m_rect.width() - w_offset);
  182.             m_rect.setHeight(m_rect.height() - h_offset);
  183.             setPos(item_pos + QPointF(w_offset,h_offset));
  184.             break;
  185.         case 2:
  186.             prepareGeometryChange();
  187.             m_rect.setHeight(m_rect.height() - h_offset);
  188.             setPos(item_pos+QPointF(0,h_offset));
  189.             break;
  190.         case 3:
  191.             prepareGeometryChange();
  192.             m_rect.setWidth(now_pos.x());
  193.             m_rect.setHeight(m_rect.height() - h_offset);
  194.             setPos(item_pos+QPointF(0,h_offset));
  195.             break;
  196.         case 4:
  197.             m_rect.setWidth(m_rect.width() - w_offset);
  198.             setPos(item_pos+QPointF(w_offset,0));
  199.             break;
  200.         case 5:
  201.             prepareGeometryChange();
  202.             m_rect.setWidth(now_pos.x());
  203.             break;
  204.         case 6:
  205.             prepareGeometryChange();
  206.             m_rect.setWidth(m_rect.width() - w_offset);
  207.             m_rect.setHeight(now_pos.y());
  208.             setPos(item_pos + QPointF(w_offset,0));
  209.             break;
  210.         case 7:
  211.             prepareGeometryChange();
  212.             m_rect.setHeight(now_pos.y());
  213.             break;
  214.         case 8:
  215.             prepareGeometryChange();
  216.             m_rect.setWidth(now_pos.x());
  217.             m_rect.setHeight(now_pos.y());
  218.             break;
  219.         default:
  220.             QGraphicsItem::mouseMoveEvent(ev);
  221.             break;
  222.         }
  223.     }
  224.     else
  225.     {
  226.         mItem->setMoving(true);
  227.         QGraphicsItem::mouseMoveEvent(ev);
  228.     }
  229. }
  230. void cgKeyPointElement::mouseReleaseEvent ( QGraphicsSceneMouseEvent * ev)
  231. {
  232.     QPointF now_pos = ev->pos();
  233.     qreal width_offset = m_rect.width() - mOldRect.width();
  234.     qreal height_offset = m_rect.height() - mOldRect.height();
  235.     qreal scaleWidth = 1.0;
  236.     qreal scaleHeight = 1.0;
  237.     QGraphicsItem * item = dynamic_cast<QGraphicsItem *>(mItem);
  238.     if(m_drag)
  239.     {
  240.         // 获取到最原始的放大倍数
  241.         QRectF rect = item->boundingRect();
  242.         if (mItem)
  243.         {
  244.             // 设置放大倍数
  245.             mItem->setRect(QRectF(0, 0, m_rect.width(), m_rect.height()));
  246.         }
  247.     }
  248.     if (item)
  249.     {
  250.         mItem->setMoving(false);
  251.         item->setPos(this->pos());
  252.     }
  253.     QGraphicsItem::mouseReleaseEvent(ev);
  254.     m_drag = false;
  255. }
  256. void cgKeyPointElement::hoverMoveEvent(QGraphicsSceneHoverEvent * ev)
  257. {
  258.     QPointF m_hoverPos = ev->pos();
  259.     qreal Rect_W = m_rect.width();
  260.     qreal Rect_W2 = m_rect.width()/2;
  261.     qreal Rect_H = m_rect.height();
  262.     qreal Rect_H2 = m_rect.height()/2;
  263.     int halfDis = 15;
  264.     int distance = 20;
  265.     if(((Rect_W2 - halfDis) < m_hoverPos.x() &&  m_hoverPos.x() < (Rect_W2 + halfDis))&&
  266.         ((Rect_H - distance) < m_hoverPos.y() && m_hoverPos.y() < (Rect_H + distance)))
  267.     {
  268.         //BottomCenter
  269.         setCursor(Qt::SizeVerCursor);
  270.         m_moveID = 7;
  271.         m_bHover = true;
  272.         m_drag = true;
  273.     }
  274.     else if(((Rect_W2 - halfDis) < m_hoverPos.x() &&  m_hoverPos.x() < (Rect_W2 + halfDis))&&
  275.         (- distance < m_hoverPos.y() && m_hoverPos.y() < distance))
  276.     {
  277.         //TopCenter
  278.         setCursor(Qt::SizeVerCursor);
  279.         m_moveID = 2;
  280.         m_bHover = true;
  281.         m_drag = true;
  282.     }
  283.     else if(((Rect_W - distance) < m_hoverPos.x() &&  m_hoverPos.x() < (Rect_W + distance))&&
  284.         (- distance < m_hoverPos.y() && m_hoverPos.y() < distance))
  285.     {
  286.         //TopRight
  287.         setCursor(Qt::SizeBDiagCursor);
  288.         m_moveID = 3;
  289.         m_bHover = true;
  290.         m_drag = true;
  291.     }
  292.     else if((- distance < m_hoverPos.x() &&  m_hoverPos.x() < distance)&&
  293.         (- distance < m_hoverPos.y() && m_hoverPos.y() < distance))
  294.     {
  295.         //TopLeft
  296.         setCursor(Qt::SizeFDiagCursor);
  297.         m_moveID = 1;
  298.         m_bHover = true;
  299.         m_drag = true;
  300.     }
  301.     else if(((Rect_W - distance) < m_hoverPos.x() &&  m_hoverPos.x() < (Rect_W + distance))&&
  302.         ((Rect_H - distance) < m_hoverPos.y() && m_hoverPos.y() < (Rect_H + distance)))
  303.     {
  304.         //BottomRight
  305.         setCursor(Qt::SizeFDiagCursor);
  306.         m_moveID = 8;
  307.         m_bHover = true;
  308.         m_drag = true;
  309.     }
  310.     else if(((- distance < m_hoverPos.x() &&  m_hoverPos.x() < distance))&&
  311.         ((Rect_H - distance) < m_hoverPos.y() && m_hoverPos.y() < (Rect_H + distance)))
  312.     {
  313.         //BottomLeft
  314.         setCursor(Qt::SizeBDiagCursor);
  315.         m_moveID = 6;
  316.         m_bHover = true;
  317.         m_drag = true;
  318.     }
  319.     else if(((Rect_W - distance) < m_hoverPos.x() &&  m_hoverPos.x() < (Rect_W + distance))&&
  320.         ((Rect_H2 - halfDis) < m_hoverPos.y() && m_hoverPos.y() < (Rect_H2 + halfDis)))
  321.     {
  322.         //RightCenter
  323.         setCursor(Qt::SizeHorCursor);
  324.         m_moveID = 5;
  325.         m_bHover = true;
  326.         m_drag = true;
  327.     }
  328.     else if(((- distance < m_hoverPos.x() &&  m_hoverPos.x() < distance))&&
  329.         ((Rect_H2 - halfDis) < m_hoverPos.y() && m_hoverPos.y() < (Rect_H2 + halfDis)))
  330.     {
  331.         //LeftCenter
  332.         setCursor(Qt::SizeHorCursor);
  333.         m_moveID = 4;
  334.         m_bHover = true;
  335.         m_drag = true;
  336.     }
  337.     else
  338.     {
  339.         //Revert
  340.         setCursor(Qt::ArrowCursor);
  341.         m_moveID = 0;
  342.         m_bHover = false;
  343.         m_drag = false;
  344.     }
  345.     update();
  346.     QGraphicsItem::hoverMoveEvent(ev);
  347. }
  348. void cgKeyPointElement::hoverLeaveEvent ( QGraphicsSceneHoverEvent * ev)
  349. {
  350.     m_bHover = false;
  351.     QGraphicsItem::hoverLeaveEvent(ev);
  352. }
  353. void cgKeyPointElement::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *ev)
  354. {
  355.     hide();
  356.     QGraphicsItem::mouseDoubleClickEvent(ev);
  357. }
  358. void cgKeyPointElement::setBoundingRect(QRectF rect)
  359. {
  360.     prepareGeometryChange();
  361.     m_rect = rect;
  362. }
                                              简单的生活使人快乐!
离线longwenbiao
只看该作者 2楼 发表于: 2009-11-26
关键是不会写,能给点思路不?
离线robertkun

只看该作者 1楼 发表于: 2009-11-26
自已写了,QT,好像没这个功能呢
                                              简单的生活使人快乐!
快速回复
限100 字节
 
上一个 下一个