Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Using Signals and Slots with Touch Events
QtWS25 Last Chance

Using Signals and Slots with Touch Events

Scheduled Pinned Locked Moved General and Desktop
3 Posts 2 Posters 5.0k Views
  • 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 Offline
    J Offline
    jesbb
    wrote on last edited by
    #1

    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
    0
    • V Offline
      V Offline
      vsorokin
      wrote on last edited by
      #2

      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
      0
      • J Offline
        J Offline
        jesbb
        wrote on last edited by
        #3

        [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
        0

        • Login

        • Login or register to search.
        • First post
          Last post
        0
        • Categories
        • Recent
        • Tags
        • Popular
        • Users
        • Groups
        • Search
        • Get Qt Extensions
        • Unsolved