Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Using Signals and Slots with Touch Events

    General and Desktop
    2
    3
    4780
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • J
      jesbb last edited by

      I'm working on an image viewer that allows users to cycle through thumbnails and move them to a larger viewing area. I want to be able to cycle through a series of pixmaps--stored in a list--by dragging left and right on a promoted graphics view (I'm using a .ui file for the interface). What makes this complicated for me is that the functions for generating the pixmaps and the pixmap list are both in my MainWindow class, and I can't move them to the promoted graphics view class because I need them elsewhere in the MainWindow class (that is, for the main viewing area, which is a non-promoted graphics view). I'm just wondering if there's some way to make this work with signals and slots.

      I do have some touch functionality in the promoted graphics view now, but it's fairly rusty:
      @sliceView::sliceView(QObject *parent)
      {
      viewport()->setAttribute(Qt::WA_AcceptTouchEvents);
      }

      bool sliceView::viewportEvent(QEvent *event)
      {
      switch(event->type())
      {
      case QEvent::TouchBegin:
      case QEvent::TouchUpdate:
      case QEvent::TouchEnd:
      {
      QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);
      QListQTouchEvent::TouchPoint touchPoints = touchEvent->touchPoints();
      if(touchPoints.count() == 2)
      {
      const QTouchEvent::TouchPoint &touchPoint1 = touchPoints.first();
      const QTouchEvent::TouchPoint &touchPoint2 = touchPoints.last();
      if(touchPoint1.state() == Qt::TouchPointReleased)
      {
      emit goBack(event);
      }
      else if(touchPoint2.state() == Qt::TouchPointReleased)
      {
      emit goForward(event);
      }
      }
      else if(touchPoints.count() == 3)
      {
      if(touchEvent->touchPointStates() & Qt::TouchPointPressed)
      {
      emit changeLevel(event);
      }
      }
      else if(touchPoints.count() == 4)
      {
      if(touchEvent->touchPointStates() & Qt::TouchPointReleased)
      {
      emit moveToMainViewer(event);
      }
      }
      return true;
      }
      default:
      break;
      }
      return QGraphicsView::viewportEvent(event);
      }@

      Here's where the signals and slots link to:
      @ connect(ui->viewer, SIGNAL(moveToMainViewer(QEvent *)), this, SLOT(displayImage()));
      connect(ui->viewer, SIGNAL(goBack(QEvent *)), this, SLOT(backwardSlice()));
      connect(ui->viewer, SIGNAL(goForward(QEvent *)), this, SLOT(forwardSlice()));
      connect(ui->viewer, SIGNAL(changeLevel(QEvent *)), this, SLOT(changeLevel()));
      .
      .
      .
      void MainWindow::displayImage()
      {
      QPixmap copyItem(newSlice2->pixmap());
      sliceCopy = new slice;
      sliceCopy->setPixmap(copyItem);
      sliceCopy->setPos(-50, 0);
      scene->addItem(sliceCopy);
      ui->graphicsView->update();
      }

      void MainWindow::backwardSlice()
      {
      if ( s >= 0 && s < thumbnailPixmapList.size() )
      {
      QPixmap nextPix = thumbnailPixmapList.at(s-1);
      --s;
      ui->horizontalSlider->setValue(s);
      newSlice2->setPixmap(nextPix);
      ui->viewer->update();
      }
      }

      void MainWindow::forwardSlice()
      {
      if ( s >= 0 && s < thumbnailPixmapList.size() )
      {
      QPixmap nextPix = thumbnailPixmapList.at(s+1);
      ++s;
      ui->horizontalSlider->setValue(s);
      newSlice2->setPixmap(nextPix);
      ui->viewer->update();
      }
      }

      void MainWindow::changeLevel()
      {
      QPixmap levelItem(QPixmap::fromImage(levelledSlice(0,s,ui->horizontalSlider_2->sliderPosition(),ui->horizontalSlider_3->sliderPosition())));
      newSlice2->setPixmap(levelItem);
      ui->viewer->update();

      }@

      If I can't do what I plan to do with signals and slots, please let me know if there are any alternatives I could try.

      1 Reply Last reply Reply Quote 0
      • V
        vsorokin last edited by

        May be it will be interesting for you: "Image Gestures Example":http://doc.qt.nokia.com/4.7/gestures-imagegestures.html

        --
        Vasiliy

        1 Reply Last reply Reply Quote 0
        • J
          jesbb last edited by

          [quote author="Vass" date="1309298312"]May be it will be interesting for you: "Image Gestures Example":http://doc.qt.nokia.com/4.7/gestures-imagegestures.html[/quote]

          That actually seems like a good idea. Unfortunately, I can't seem to get a QSwipeGesture to work in a QGraphicsView. Here's what I have so far:

          Class Declaration:
          @class sliceView : public QGraphicsView
          {
          Q_OBJECT
          public:
          explicit sliceView(QWidget *parent = 0);
          bool viewportEvent(QEvent *event);

          signals:
          void moveToMainViewer(QEvent *);
          void goBack(QSwipeGesture *);
          void goForward(QEvent *);
          void changeLevel(QEvent *);

          protected:
          bool event(QEvent *event);

          private:
          bool gestureEvent(QGestureEvent *event);
          void swipeTriggered(QSwipeGesture *);

          };@

          .cpp file:
          @
          #include "sliceview.h"
          #include <QtGui>
          #include <QTouchEvent>

          sliceView::sliceView(QWidget *parent)
          : QGraphicsView(parent)
          {
          viewport()->setAttribute(Qt::WA_AcceptTouchEvents);
          grabGesture(Qt::SwipeGesture);
          }

          bool sliceView::event(QEvent event)
          {
          if(event->type() == QEvent::Gesture)
          return gestureEvent(static_cast<QGestureEvent
          >(event));
          return QGraphicsView::event(event);
          }

          bool sliceView::gestureEvent(QGestureEvent *event)
          {
          if(QGesture *swipe = event->gesture(Qt::SwipeGesture))
          swipeTriggered(static_cast<QSwipeGesture *> (swipe));
          return true;
          }

          void sliceView::swipeTriggered(QSwipeGesture *gesture)
          {
          if(gesture->state() == Qt::GestureFinished)
          {
          if(gesture->horizontalDirection() == QSwipeGesture::Left)
          emit goBack(gesture);
          update();
          }
          }

          bool sliceView::viewportEvent(QEvent *event)
          {
          switch(event->type())
          {
          case QEvent::TouchBegin:
          case QEvent::TouchUpdate:
          case QEvent::TouchEnd:
          {
          QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);
          QListQTouchEvent::TouchPoint touchPoints = touchEvent->touchPoints();
          if(touchPoints.count() == 3)
          {
          if(touchEvent->touchPointStates() & Qt::TouchPointPressed)
          {
          emit changeLevel(event);
          }
          }
          else if(touchPoints.count() == 4)
          {
          if(touchEvent->touchPointStates() & Qt::TouchPointReleased)
          {
          emit moveToMainViewer(event);
          }
          }
          return true;
          }
          default:
          break;
          }
          return QGraphicsView::viewportEvent(event);
          }
          @

          1 Reply Last reply Reply Quote 0
          • First post
            Last post