myview.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  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. // QPoint x = viewport()->rect().center();
  65. // std::cout<<" x is"<<sceneRect().bottom()<<" y is "<<sceneRect().y()<<std::endl;
  66. // QScrollBar * ps = verticalScrollBar();
  67. // std::cout<<" size is "<<ps->size().height()<<" v = "<<ps->value()<<std::endl;
  68. }
  69. // 缩小
  70. void MyView::zoomOut()
  71. {
  72. int width,hgt;
  73. width = sceneRect().width();
  74. hgt = sceneRect().height();
  75. QScrollBar * psV = verticalScrollBar();
  76. QScrollBar * psH = horizontalScrollBar();
  77. int centery = (psV->value() + psV->size().height()/2)/beishu;
  78. int centerx = (psH->value() + psH->size().width()/2)/beishu;
  79. #ifndef ANDROID
  80. scale(1 / 1.1, 1 / 1.1);
  81. beishu /= 1.1;
  82. #else
  83. scale(1 / 1.6, 1 / 1.6);
  84. beishu /= 1.6;
  85. #endif
  86. // centerOn(450, 700 - (200 / beishu));
  87. centerOn(centerx,centery);
  88. }
  89. void MyView::zoomone()
  90. {
  91. scale(1 /beishu, 1 / beishu);
  92. beishu = 1.0;
  93. }
  94. void MyView::mouseDoubleClickEvent(QMouseEvent *event)
  95. {
  96. QScrollBar * psV = verticalScrollBar();
  97. QScrollBar * psH = horizontalScrollBar();
  98. int centery = (psV->value() + psV->size().height()/2)/beishu;
  99. int centerx = (psH->value() + psH->size().width()/2)/beishu;
  100. // qDebug("x is %d y is %d view center x is %d centerx is %d",event->pos().x(),
  101. // event->pos().y(),
  102. // viewport()->rect().center().x(),centerx);
  103. int viewx,viewy;
  104. if(beishu == 0)return;
  105. viewx = centerx +(event->pos().x() - viewport()->rect().center().x())/beishu;
  106. viewy = centery +(event->pos().y() - viewport()->rect().center().y())/beishu;
  107. QPoint viewpoint;
  108. viewpoint.setX(viewx);
  109. viewpoint.setY(viewy);
  110. emit dbclickxy(viewx,viewy);
  111. qDebug("view x is %d view y is %d ",viewx,viewy);
  112. }
  113. bool MyView::event(QEvent *event)
  114. {
  115. if (event->type() == QEvent::Gesture)
  116. {
  117. // qDebug("gestrue event");
  118. // return true;
  119. return gestureEvent(static_cast<QGestureEvent*>(event));
  120. }
  121. return QGraphicsView::event(event);
  122. }
  123. bool MyView::gestureEvent(QGestureEvent *event)
  124. {
  125. if (QGesture *pinch = event->gesture(Qt::PinchGesture))
  126. pinchTriggered(static_cast<QPinchGesture *>(pinch));
  127. return true;
  128. }
  129. void MyView::pinchTriggered(QPinchGesture *gesture)
  130. {
  131. static double currentStepScaleFactor = 1;
  132. static double oldfactor = 1;
  133. QPinchGesture::ChangeFlags changeFlags = gesture->changeFlags();
  134. if (changeFlags & QPinchGesture::ScaleFactorChanged) {
  135. currentStepScaleFactor = gesture->totalScaleFactor();
  136. mbInPinch = true;
  137. }
  138. if (gesture->state() == Qt::GestureFinished) {
  139. // scaleFactor *= currentStepScaleFactor;
  140. // qDebug("scale is %f ",currentStepScaleFactor);
  141. currentStepScaleFactor = 1;
  142. oldfactor = 1;
  143. mbInPinch = false;
  144. }
  145. int width,hgt;
  146. width = sceneRect().width();
  147. hgt = sceneRect().height();
  148. QScrollBar * psV = verticalScrollBar();
  149. QScrollBar * psH = horizontalScrollBar();
  150. int centery = (psV->value() + psV->size().height()/2)/beishu;
  151. int centerx = (psH->value() + psH->size().width()/2)/beishu;
  152. double fscale = currentStepScaleFactor/oldfactor;
  153. scale(fscale,fscale);
  154. beishu *= fscale;
  155. oldfactor = currentStepScaleFactor;
  156. centerOn(centerx,centery);
  157. }