drawtool.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626
  1. #include "drawtool.h"
  2. #include "GraphicsEllipseItem.h"
  3. #include "GraphicsTextItem.h"
  4. #include "GraphicsLineItem.h"
  5. #include "GraphicsTriangleItem.h"
  6. #define PI 3.14
  7. QList<DrawTool*> DrawTool::c_tools;
  8. QPointF DrawTool::c_down;
  9. QPointF DrawTool::c_last;
  10. quint32 DrawTool::c_nDownFlags;
  11. DrawBaseShape DrawTool::c_drawShape = selection;
  12. static SelectTool selectTool;
  13. static PenPathTool penPathTool(penPath);
  14. static LineTool lineTool(line);
  15. static ImageTool imageTool(image);
  16. static RectTool rectTool(rectangle);
  17. static RectTool triangleTool(triangle);
  18. static RectTool roundRectTool(roundrect);
  19. static RectTool ellipseTool(ellipse);
  20. static RotationTool rotationTool;
  21. static ArrowItem arrowTool(arrowLine);
  22. enum SelectMode
  23. {
  24. none,
  25. netSelect,
  26. move, //移动
  27. size, //改变大小
  28. rotate //反转
  29. };
  30. SelectMode selectMode = none;
  31. SizeHandleRect::Direction nDragHandle = SizeHandleRect::None;
  32. static void setCursor(QGraphicsScene * scene , const QCursor & cursor )
  33. {
  34. QList<QGraphicsView*> views = scene->views();
  35. if ( views.count() > 0 ){
  36. QGraphicsView * view = views.first();
  37. view->setCursor(cursor);
  38. }
  39. }
  40. DrawTool::DrawTool(DrawBaseShape shape)
  41. {
  42. m_drawShape = shape ;
  43. c_tools.push_back(this);
  44. }
  45. void DrawTool::mousePressEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
  46. {
  47. c_down = event->scenePos();
  48. c_last = event->scenePos();
  49. }
  50. void DrawTool::mouseMoveEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
  51. {
  52. c_last = event->scenePos();
  53. }
  54. void DrawTool::mouseReleaseEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
  55. {
  56. if (event->scenePos() == c_down)
  57. c_drawShape = selection;
  58. setCursor(scene,Qt::ArrowCursor);
  59. }
  60. DrawTool *DrawTool::findTool(DrawBaseShape drawShape)
  61. {
  62. QList<DrawTool*>::const_iterator iter = c_tools.constBegin();
  63. for ( ; iter != c_tools.constEnd() ; ++iter ){
  64. if ((*iter)->m_drawShape == drawShape )
  65. return (*iter);
  66. }
  67. return 0;
  68. }
  69. SelectTool::SelectTool()
  70. :DrawTool(selection)
  71. {
  72. m_lastSize.setHeight(0);
  73. m_lastSize.setWidth(0);
  74. dashRect = 0;
  75. dashLine = 0;
  76. m_hoverSizer = false;
  77. }
  78. void SelectTool::mousePressEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
  79. {
  80. DrawTool::mousePressEvent(event,scene);
  81. if (!m_hoverSizer)
  82. scene->mouseEvent(event);
  83. selectMode = none;
  84. QList<QGraphicsItem *> items = scene->selectedItems();
  85. GraphicsItem *item = 0;
  86. if ( items.count() == 1 )
  87. {
  88. item = qgraphicsitem_cast<GraphicsItem*>(items.first());
  89. }
  90. if ( item != 0 &&
  91. item->type() !=GraphicsItem::UserType+3){
  92. nDragHandle = item->hitTest(event->scenePos());
  93. if ( nDragHandle !=SizeHandleRect::None)
  94. selectMode = size;
  95. else
  96. selectMode = move;
  97. }
  98. if( selectMode == none ){
  99. selectMode = netSelect;
  100. QList<QGraphicsView*> views = scene->views();
  101. if ( views.count() > 0 ){
  102. QGraphicsView * view = views.first();
  103. view->setDragMode(QGraphicsView::RubberBandDrag);
  104. }
  105. }
  106. if ( selectMode == move && items.count() == 1 ){
  107. if (dashRect ){
  108. scene->removeItem(dashRect);
  109. delete dashRect;
  110. dashRect = 0;
  111. }
  112. if (dashLine ) {
  113. scene->removeItem(dashLine);
  114. delete dashLine;
  115. dashLine = 0;
  116. }
  117. item->setPos(item->mapToScene(item->boundingRect().topLeft()));
  118. item->resetShape();
  119. dashRect = new QGraphicsPathItem(item->shape());
  120. dashRect->setPen(Qt::DashLine);
  121. dashRect->setPos(item->pos());
  122. //dashRect->setTransformOriginPoint(item->transformOriginPoint());
  123. dashRect->setTransform(item->transform());
  124. dashRect->setRotation(item->rotation());
  125. scene->addItem(dashRect);
  126. dashLine = new QGraphicsLineItem();
  127. dashLine->setPos(item->pos());
  128. dashLine->setPen(Qt::DashLine);
  129. scene->addItem(dashLine);
  130. }
  131. }
  132. void SelectTool::mouseMoveEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
  133. {
  134. DrawTool::mouseMoveEvent(event,scene);
  135. bool isGroup = false;
  136. QList<QGraphicsItem *> items = scene->selectedItems();
  137. GraphicsItem * item = 0;
  138. if ( items.count() == 1 )
  139. {
  140. item = qgraphicsitem_cast<GraphicsItem*>(items.first());
  141. if ( item != 0 ){
  142. if(item->type() ==GraphicsItem::UserType+3)
  143. {
  144. scene->mouseEvent(event);
  145. scene->update();
  146. return;
  147. }
  148. if ( nDragHandle != SizeHandleRect::None && selectMode == size ){
  149. item->resizeTo(nDragHandle,c_last);
  150. }
  151. else if(nDragHandle == SizeHandleRect::None && selectMode == selection ){
  152. SizeHandleRect::Direction handle = item->hitTest(event->scenePos());
  153. if ( handle != SizeHandleRect::None){
  154. setCursor(scene,item->getCursor(handle));
  155. m_hoverSizer = true;
  156. }else{
  157. setCursor(scene,Qt::ArrowCursor);
  158. m_hoverSizer = false;
  159. }
  160. }
  161. }
  162. QGraphicsItemGroup *item1 = qgraphicsitem_cast<QGraphicsItemGroup*>(items.first());
  163. if ( item1 != NULL ){
  164. isGroup = true;
  165. }
  166. }
  167. if ( selectMode == move ){
  168. if ( dashRect )
  169. {
  170. dashRect->setPos(c_last);
  171. dashLine->setLine(QLineF(dashLine->mapFromItem(item,item->boundingRect().topLeft()),
  172. dashLine->mapFromScene(c_last)));
  173. }
  174. }
  175. else if ((selectMode != size && items.count() > 0) || isGroup )
  176. {
  177. scene->mouseEvent(event);
  178. }
  179. scene->update();
  180. }
  181. void SelectTool::mouseReleaseEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
  182. {
  183. DrawTool::mouseReleaseEvent(event,scene);
  184. QList<QGraphicsItem *> items = scene->selectedItems();
  185. if ( items.count() == 1 ){
  186. GraphicsItem * item = qgraphicsitem_cast<GraphicsItem*>(items.first());
  187. if ( item != 0 )
  188. {
  189. if(selectMode == move && c_last != c_down ){
  190. item->setPos(c_last);
  191. }
  192. item->resetArrow();
  193. }
  194. }
  195. if (selectMode == netSelect ){
  196. QList<QGraphicsView*> views = scene->views();
  197. if ( views.count() > 0 ){
  198. QGraphicsView * view = views.first();
  199. view->setDragMode(QGraphicsView::NoDrag);
  200. }
  201. }
  202. if (dashRect ){
  203. scene->removeItem(dashRect);
  204. delete dashRect;
  205. dashRect = 0;
  206. scene->removeItem(dashLine);
  207. delete dashLine;
  208. dashLine = 0;
  209. }
  210. selectMode = none;
  211. nDragHandle = SizeHandleRect::None;
  212. m_hoverSizer = false;
  213. scene->mouseEvent(event);
  214. }
  215. RotationTool::RotationTool()
  216. :DrawTool(rotation)
  217. {
  218. lastAngle == 0;
  219. dashRect = 0;
  220. }
  221. void RotationTool::mousePressEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
  222. {
  223. DrawTool::mousePressEvent(event,scene);
  224. QList<QGraphicsItem *> items = scene->selectedItems();
  225. if ( items.count() == 1 ){
  226. GraphicsItem * item = qgraphicsitem_cast<GraphicsItem*>(items.first());
  227. if ( item != 0 ){
  228. nDragHandle = item->hitTest(event->scenePos());
  229. if ( nDragHandle !=SizeHandleRect::None)
  230. {
  231. QPointF origin = item->mapToScene(item->boundingRect().center());
  232. qreal len_y = c_last.y() - origin.y();
  233. qreal len_x = c_last.x() - origin.x();
  234. qreal angle = atan2(len_y,len_x)*180/PI;
  235. lastAngle = angle;
  236. selectMode = rotate;
  237. if (dashRect ){
  238. scene->removeItem(dashRect);
  239. delete dashRect;
  240. dashRect = 0;
  241. }
  242. dashRect = new QGraphicsPathItem(item->shape());
  243. dashRect->setPen(Qt::DashLine);
  244. dashRect->setPos(item->pos());
  245. dashRect->setTransformOriginPoint(item->transformOriginPoint());
  246. dashRect->setTransform(item->transform());
  247. dashRect->setRotation(item->rotation());
  248. scene->addItem(dashRect);
  249. setCursor(scene,QCursor(QPixmap(":/new/prefix1/images/rotation.ico")));
  250. }
  251. else{
  252. scene->clearSelection();
  253. c_drawShape = selection;
  254. }
  255. }
  256. }
  257. }
  258. void RotationTool::mouseMoveEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
  259. {
  260. DrawTool::mouseMoveEvent(event,scene);
  261. QList<QGraphicsItem *> items = scene->selectedItems();
  262. if ( items.count() == 1 ){
  263. GraphicsItem * item = qgraphicsitem_cast<GraphicsItem*>(items.first());
  264. if ( item != 0 && nDragHandle !=SizeHandleRect::None && selectMode == rotate ){
  265. QPointF origin = item->mapToScene(item->boundingRect().center());
  266. qreal len_y = c_last.y() - origin.y();
  267. qreal len_x = c_last.x() - origin.x();
  268. qreal angle = atan2(len_y,len_x)*180/PI;
  269. angle = item->rotation() + int(angle - lastAngle) ;
  270. if ( angle > 360 )
  271. angle -= 360;
  272. if ( dashRect ){
  273. dashRect->setRotation( angle );
  274. scene->update();
  275. }
  276. setCursor(scene,QCursor(QPixmap(":/new/prefix1/images/rotation.ico")));
  277. }
  278. else if ( item )
  279. {
  280. SizeHandleRect::Direction handle = item->hitTest(event->scenePos());
  281. if ( handle != SizeHandleRect::None)
  282. setCursor(scene,QCursor(QPixmap(":/new/prefix1/images/rotation.ico")));
  283. else
  284. setCursor(scene,Qt::ArrowCursor);
  285. }
  286. }
  287. }
  288. void RotationTool::mouseReleaseEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
  289. {
  290. DrawTool::mouseReleaseEvent(event,scene);
  291. QList<QGraphicsItem *> items = scene->selectedItems();
  292. if ( items.count() == 1 ){
  293. GraphicsItem * item = qgraphicsitem_cast<GraphicsItem*>(items.first());
  294. if ( item != 0 && nDragHandle !=SizeHandleRect::None && selectMode == rotate ){
  295. QPointF origin = item->mapToScene(item->boundingRect().center());
  296. QPointF delta = c_last - origin ;
  297. qreal len_y = c_last.y() - origin.y();
  298. qreal len_x = c_last.x() - origin.x();
  299. qreal angle = atan2(len_y,len_x)*180/PI;
  300. angle = item->rotation() + int(angle - lastAngle) ;
  301. if ( angle > 360 )
  302. angle -= 360;
  303. item->setRotation( angle );
  304. }
  305. }
  306. setCursor(scene,Qt::ArrowCursor);
  307. selectMode = none;
  308. nDragHandle = SizeHandleRect::None;
  309. lastAngle = 0;
  310. if (dashRect ){
  311. scene->removeItem(dashRect);
  312. delete dashRect;
  313. dashRect = 0;
  314. }
  315. qDebug() << " RotationTool release:" <<event->scenePos();
  316. }
  317. /*************************************ImageTool*******************/
  318. ImageTool::ImageTool(DrawBaseShape drawShape)
  319. :DrawTool(drawShape)
  320. {
  321. }
  322. void ImageTool::setPicture(QString path )
  323. {
  324. _imgPath =path;
  325. }
  326. void ImageTool::mousePressEvent(QGraphicsSceneMouseEvent * event , MainPaintScene * scene )
  327. {
  328. DrawTool::mousePressEvent(event,scene);
  329. scene->clearSelection();
  330. QPixmap pixmap;
  331. bool ok= pixmap.load(_imgPath);
  332. if(! ok)
  333. return;
  334. switch ( c_drawShape ){
  335. case image:
  336. item = new GraphicsPixmapItem(pixmap,NULL);
  337. break;
  338. }
  339. if ( item == 0) return;
  340. item->setPos(event->scenePos());
  341. scene->addItem(item);
  342. item->setSelected(true);
  343. selectMode = size;
  344. nDragHandle = SizeHandleRect::RightBottom;
  345. }
  346. void ImageTool::mouseMoveEvent(QGraphicsSceneMouseEvent * event , MainPaintScene * scene )
  347. {
  348. setCursor(scene,Qt::CrossCursor);
  349. selectTool.mouseMoveEvent(event,scene);
  350. }
  351. void ImageTool::mouseReleaseEvent(QGraphicsSceneMouseEvent * event , MainPaintScene * scene )
  352. {
  353. if ( event->scenePos() == c_down ){
  354. if ( item != 0)
  355. scene->removeItem(item);
  356. selectTool.mousePressEvent(event,scene);
  357. }
  358. selectTool.mouseReleaseEvent(event,scene);
  359. }
  360. /*************************************RectTool*******************/
  361. RectTool::RectTool(DrawBaseShape drawShape)
  362. :DrawTool(drawShape)
  363. {
  364. }
  365. void RectTool::mousePressEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
  366. {
  367. DrawTool::mousePressEvent(event,scene);
  368. scene->clearSelection();
  369. bool isSquare =false;
  370. if (event->button() == Qt::LeftButton)
  371. {
  372. if (QApplication::keyboardModifiers()== Qt::ControlModifier)
  373. {
  374. isSquare =true;
  375. }
  376. }
  377. switch ( c_drawShape ){
  378. case rectangle:
  379. item = new GraphicsRectItem(QRect(0,0,0,0),NULL);
  380. item->setPen(Qt::NoPen);
  381. break;
  382. case ellipse:
  383. item = new GraphicsEllipseItem(QRect(0,0,0,0),NULL);
  384. item->setPen(Qt::NoPen);
  385. break;
  386. case triangle:
  387. item = new GraphicsTriangleItem(QRect(0,0,0,0),NULL);
  388. item->setPen(Qt::NoPen);
  389. break;
  390. }
  391. if ( item == 0) return;
  392. if(isSquare)
  393. item->setIsSquare();
  394. item->setBorderColor(_mColor);
  395. item->setPos(event->scenePos());
  396. scene->addItem(item);
  397. item->setSelected(true);
  398. selectMode = size;
  399. nDragHandle = SizeHandleRect::RightBottom;
  400. }
  401. void RectTool::mouseMoveEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
  402. {
  403. setCursor(scene,Qt::CrossCursor);
  404. selectTool.mouseMoveEvent(event,scene);
  405. }
  406. void RectTool::mouseReleaseEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
  407. {
  408. if ( event->scenePos() == c_down ){
  409. if (item != 0)
  410. scene->removeItem(item);
  411. selectTool.mousePressEvent(event,scene);
  412. }
  413. selectTool.mouseReleaseEvent(event,scene);
  414. }
  415. /////////****************PenPath************/////////////////////
  416. PenPathTool::PenPathTool(DrawBaseShape drawShape)
  417. :DrawTool(drawShape)
  418. {
  419. _path =nullptr;
  420. }
  421. void PenPathTool::mousePressEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
  422. {
  423. DrawTool::mousePressEvent(event,scene);
  424. scene->clearSelection();
  425. switch ( c_drawShape ){
  426. case penPath:
  427. SafeDelete(_path);
  428. _path = new QPainterPath;
  429. _path->moveTo(event->scenePos());
  430. item = new QGraphicsPathItem(*_path,nullptr);
  431. item->setFlag(QGraphicsItem::ItemIsMovable, true);
  432. item->setFlag(QGraphicsItem::ItemIsSelectable, true);
  433. break;
  434. }
  435. if ( item == 0) return;
  436. isDrawing =true;
  437. scene->addItem(item);
  438. QPen pen_bak=item->pen();
  439. pen_bak.setWidth(9);
  440. pen_bak.setColor(_mColor);
  441. item->setPen(pen_bak);
  442. }
  443. void PenPathTool::mouseMoveEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
  444. {
  445. if(isDrawing)
  446. {
  447. QPixmap pixmap(":/new/prefix1/images/ic_sidebar_pencil.png");
  448. //定义大小
  449. QSize picSize(8, 8);
  450. //缩放图片,按比例
  451. QPixmap scaledPixmap = pixmap.scaled(picSize, Qt::KeepAspectRatio);
  452. //设置样式
  453. QCursor cursor(scaledPixmap, -1, -1);
  454. setCursor(scene,cursor);
  455. _path->lineTo(event->scenePos());
  456. item->setPath(*_path);
  457. }
  458. }
  459. void PenPathTool::mouseReleaseEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
  460. {
  461. isDrawing=false;
  462. }
  463. /////////****************LineTool************/////////////////////
  464. LineTool::LineTool(DrawBaseShape drawShape)
  465. :DrawTool(drawShape)
  466. {
  467. item =nullptr;
  468. }
  469. void LineTool::mousePressEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
  470. {
  471. DrawTool::mousePressEvent(event,scene);
  472. scene->clearSelection();
  473. switch ( c_drawShape ){
  474. case line:
  475. item = new GraphicsLineItem(QLineF(event->scenePos(),
  476. event->scenePos()));
  477. item->setFlag(QGraphicsItem::ItemIsMovable, true);
  478. item->setFlag(QGraphicsItem::ItemIsSelectable, true);
  479. break;
  480. }
  481. if ( item == 0) return;
  482. isDrawing =true;
  483. // 设置画笔
  484. QPen pen = item->pen();
  485. pen.setColor(_mColor);
  486. pen.setWidth(4);
  487. item->setPen(pen);
  488. scene->addItem(item);
  489. }
  490. void LineTool::mouseMoveEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
  491. {
  492. if(isDrawing)
  493. {
  494. QLineF newLine(item->line().p1(), event->scenePos());
  495. item->setLine(newLine);
  496. }
  497. }
  498. void LineTool::mouseReleaseEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
  499. {
  500. isDrawing=false;
  501. }
  502. /////////****************ArrowItem************/////////////////////
  503. ArrowItem::ArrowItem(DrawBaseShape drawShape)
  504. :DrawTool(drawShape)
  505. {
  506. }
  507. void ArrowItem::mousePressEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
  508. {
  509. DrawTool::mousePressEvent(event,scene);
  510. scene->clearSelection();
  511. switch ( c_drawShape ){
  512. case arrowLine:
  513. item = new GraphicsArrowItem();
  514. item->setFlag(QGraphicsItem::ItemIsMovable, true);
  515. item->setFlag(QGraphicsItem::ItemIsSelectable, true);
  516. item->endPos= event->scenePos();
  517. item->startPos= event->scenePos();
  518. break;
  519. }
  520. if ( item == 0) return;
  521. isDrawing =true;
  522. item->setBorderColor(_mColor);
  523. scene->addItem(item);
  524. }
  525. void ArrowItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
  526. {
  527. if(isDrawing)
  528. {
  529. item->endPos= event->scenePos();
  530. scene->update();
  531. }
  532. }
  533. void ArrowItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
  534. {
  535. isDrawing=false;
  536. }