myview.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. #include "myview.h"
  2. #include <QScrollBar>
  3. #include <iostream>
  4. #define VIEW_CENTER viewport()->rect().center()
  5. const double PI = 3.1415926535898;
  6. MyView::MyView(QWidget *parent) :
  7. QGraphicsView(parent),
  8. beishu(1.00000)
  9. {
  10. setDragMode(QGraphicsView::ScrollHandDrag);
  11. // grabGesture(Qt::PanGesture);
  12. grabGesture(Qt::PinchGesture);
  13. // grabGesture(Qt::SwipeGesture);
  14. }
  15. void MyView::mousePressEvent(QMouseEvent *event)
  16. {
  17. // qDebug("x is %d",event->pos().x());
  18. bottonstatus = true;
  19. QGraphicsView::mousePressEvent(event);
  20. }
  21. void MyView::mouseMoveEvent(QMouseEvent *event)
  22. {
  23. if(mbInPinch == true)return;
  24. QGraphicsView::mouseMoveEvent(event);
  25. // QScrollBar * ps = verticalScrollBar();
  26. // std::cout<<" size is "<<ps->size().height()<<" v = "<<ps->value()<<std::endl;
  27. // QScrollBar * ps2= horizontalScrollBar();
  28. // std::cout<<" size is "<<ps2->size().width()<<" h = "<<ps2->value()<<std::endl;
  29. }
  30. void MyView::mouseReleaseEvent(QMouseEvent *event)
  31. {
  32. bottonstatus = false;
  33. QGraphicsView::mouseReleaseEvent(event);
  34. }
  35. // 放大/缩小
  36. void MyView::wheelEvent(QWheelEvent *event)
  37. {
  38. // 滚轮的滚动量
  39. QPoint scrollAmount = event->angleDelta();
  40. // 正值表示滚轮远离使用者(放大),负值表示朝向使用者(缩小)
  41. scrollAmount.y() > 0 ? zoomIn() : zoomOut();
  42. }
  43. // 放大
  44. void MyView::zoomIn()
  45. {
  46. int width,hgt;
  47. width = sceneRect().width();
  48. hgt = sceneRect().height();
  49. QScrollBar * psV = verticalScrollBar();
  50. QScrollBar * psH = horizontalScrollBar();
  51. // qDebug("%d %d ",width,hgt);
  52. int centery = (psV->value() + psV->size().height()/2)/beishu;
  53. int centerx = (psH->value() + psH->size().width()/2)/beishu;
  54. #ifndef ANDROID
  55. scale(1.1, 1.1);
  56. beishu *= 1.1;
  57. #else
  58. scale(1.6, 1.6);
  59. beishu *= 1.6;
  60. #endif
  61. // centerOn(450, 700 - (200 / beishu));
  62. // qDebug("beishu is %f",beishu);
  63. centerOn(centerx,centery);
  64. emit beishuchange(beishu);
  65. // QPoint x = viewport()->rect().center();
  66. // std::cout<<" x is"<<sceneRect().bottom()<<" y is "<<sceneRect().y()<<std::endl;
  67. // QScrollBar * ps = verticalScrollBar();
  68. // std::cout<<" size is "<<ps->size().height()<<" v = "<<ps->value()<<std::endl;
  69. }
  70. // 缩小
  71. void MyView::zoomOut()
  72. {
  73. int width,hgt;
  74. width = sceneRect().width();
  75. hgt = sceneRect().height();
  76. QScrollBar * psV = verticalScrollBar();
  77. QScrollBar * psH = horizontalScrollBar();
  78. int centery = (psV->value() + psV->size().height()/2)/beishu;
  79. int centerx = (psH->value() + psH->size().width()/2)/beishu;
  80. #ifndef ANDROID
  81. scale(1 / 1.1, 1 / 1.1);
  82. beishu /= 1.1;
  83. #else
  84. scale(1 / 1.6, 1 / 1.6);
  85. beishu /= 1.6;
  86. #endif
  87. // centerOn(450, 700 - (200 / beishu));
  88. centerOn(centerx,centery);
  89. emit beishuchange(beishu);
  90. }
  91. void MyView::zoomone()
  92. {
  93. scale(1 /beishu, 1 / beishu);
  94. beishu = 1.0;
  95. emit beishuchange(beishu);
  96. }
  97. void MyView::mouseDoubleClickEvent(QMouseEvent *event)
  98. {
  99. QScrollBar * psV = verticalScrollBar();
  100. QScrollBar * psH = horizontalScrollBar();
  101. int centery = (psV->value() + psV->size().height()/2)/beishu;
  102. int centerx = (psH->value() + psH->size().width()/2)/beishu;
  103. // qDebug("x is %d y is %d view center x is %d centerx is %d",event->pos().x(),
  104. // event->pos().y(),
  105. // viewport()->rect().center().x(),centerx);
  106. int viewx,viewy;
  107. if(beishu == 0)return;
  108. viewx = centerx +(event->pos().x() - viewport()->rect().center().x())/beishu;
  109. viewy = centery +(event->pos().y() - viewport()->rect().center().y())/beishu;
  110. QPoint viewpoint;
  111. viewpoint.setX(viewx);
  112. viewpoint.setY(viewy);
  113. emit dbclickxy(viewx,viewy);
  114. qDebug("view x is %d view y is %d ",viewx,viewy);
  115. }
  116. bool MyView::event(QEvent *event)
  117. {
  118. if (event->type() == QEvent::Gesture)
  119. {
  120. // qDebug("gestrue event");
  121. // return true;
  122. return gestureEvent(static_cast<QGestureEvent*>(event));
  123. }
  124. return QGraphicsView::event(event);
  125. }
  126. bool MyView::gestureEvent(QGestureEvent *event)
  127. {
  128. if (QGesture *pinch = event->gesture(Qt::PinchGesture))
  129. pinchTriggered(static_cast<QPinchGesture *>(pinch));
  130. return true;
  131. }
  132. void MyView::pinchTriggered(QPinchGesture *gesture)
  133. {
  134. static double currentStepScaleFactor = 1;
  135. static double oldfactor = 1;
  136. QPinchGesture::ChangeFlags changeFlags = gesture->changeFlags();
  137. if (changeFlags & QPinchGesture::ScaleFactorChanged) {
  138. currentStepScaleFactor = gesture->totalScaleFactor();
  139. mbInPinch = true;
  140. }
  141. if (gesture->state() == Qt::GestureFinished) {
  142. // scaleFactor *= currentStepScaleFactor;
  143. // qDebug("scale is %f ",currentStepScaleFactor);
  144. currentStepScaleFactor = 1;
  145. oldfactor = 1;
  146. mbInPinch = false;
  147. }
  148. int width,hgt;
  149. width = sceneRect().width();
  150. hgt = sceneRect().height();
  151. QScrollBar * psV = verticalScrollBar();
  152. QScrollBar * psH = horizontalScrollBar();
  153. int centery = (psV->value() + psV->size().height()/2)/beishu;
  154. int centerx = (psH->value() + psH->size().width()/2)/beishu;
  155. double fscale = currentStepScaleFactor/oldfactor;
  156. scale(fscale,fscale);
  157. beishu *= fscale;
  158. oldfactor = currentStepScaleFactor;
  159. centerOn(centerx,centery);
  160. }
  161. double MyView::getbeishu()
  162. {
  163. return beishu;
  164. }