Advertisement
framp

QGraphicsView with dragging, click detection and zoom

Jul 15th, 2013
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.86 KB | None | 0 0
  1. #include "calculator/calculatorgridview.h"
  2.  
  3.  
  4. CalculatorGridView::CalculatorGridView(QWidget* parent) :
  5.     QGraphicsView(parent), selectedX(0), selectedY(0), gridWidth(0), gridHeight(0)
  6. {
  7.  
  8.     setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
  9.  
  10.     scene = new QGraphicsScene(this);
  11.     setScene(scene);
  12.  
  13.     setDragMode(QGraphicsView::ScrollHandDrag);
  14. }
  15.  
  16. void CalculatorGridView::wheelEvent(QWheelEvent* event)
  17. {
  18.     double scaleFactor = 1.15;
  19.     if(event->delta() > 0) {
  20.         scale(scaleFactor, scaleFactor);
  21.     } else {
  22.         scale(1.0 / scaleFactor, 1.0 / scaleFactor);
  23.     }
  24. }
  25.  
  26. void CalculatorGridView::mousePressEvent(QMouseEvent * event)
  27. {
  28.     dragging = false;
  29.     QTimer::singleShot(150, this, SLOT(trueDragging()));
  30.     QGraphicsView::mousePressEvent(event);
  31. }
  32.  
  33. void CalculatorGridView::mouseReleaseEvent(QMouseEvent * event)
  34. {
  35.     if (dragging==false) {
  36.         QPointF point = mapToScene(event->pos()).toPoint();
  37.         int newX = point.x()/20,
  38.             newY = point.y()/20;
  39.         if (newX>=0 && newY>=0 &&
  40.                 gridWidth>newX && gridHeight>newY) {
  41.             scene->removeItem(scene->itemAt(selectedX*20, selectedY*20));
  42.             scene->addRect(newX*20, newY*20, 20, 20, QPen("red"))->setZValue(2);
  43.             selectedX = newX;
  44.             selectedY = newY;
  45.         }
  46.     }
  47.     QGraphicsView::mouseReleaseEvent(event);
  48. }
  49.  
  50. void CalculatorGridView::trueDragging()
  51. {
  52.     dragging = true;
  53. }
  54.  
  55. void CalculatorGridView::render(CISpointer<Base> obj)
  56. {
  57.     if (obj->getType()=="Grid") {
  58.         scene->clear();
  59.         Grid * grid = static_cast<Grid *>(&*obj);
  60.  
  61.         bool sizeChanged = false;
  62.         if (gridWidth!=grid->width) {
  63.             gridWidth = grid->width;
  64.             sizeChanged = true;
  65.         }
  66.         if (gridHeight!=grid->height) {
  67.             gridHeight = grid->height;
  68.             sizeChanged = true;
  69.         }
  70.  
  71.         for (int x=0; x<gridWidth; x++) {
  72.             for (int y=0; y<gridHeight; y++) {
  73.                 CISpointer<Cell> cell = grid->cells[y*gridWidth+x];
  74.                 scene->addRect(x*20, y*20, 20, 20);
  75.                 if (x==selectedX && y==selectedY) {
  76.                     scene->addRect(x*20, y*20, 20, 20, QPen("red"))->setZValue(2);
  77.                 }
  78.                 if (cell!=0) {
  79.                     QString path = QString::fromStdString(cell->toPath());
  80.                     QGraphicsSvgItem *item = new QGraphicsSvgItem(":/resources/" + path + ".svg");
  81.                     item->setPos(x*20, y*20);
  82.                     item->setZValue(1);
  83.                     scene->addItem(item);
  84.                 }
  85.             }
  86.         }
  87.         if (sizeChanged)
  88.             setSceneRect(scene->itemsBoundingRect());
  89.     }
  90. }
  91.  
  92. QString CalculatorGridView::selected() const
  93. {
  94.     return QString::number(selectedX) + "," + QString::number(selectedY);
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement