Gesture-Demo: ImageWidget geht das auch mit der Maus

Alles rund um die Programmierung mit Qt
Antworten
Psychomax
Beiträge: 52
Registriert: 29. Dezember 2008 13:28

Gesture-Demo: ImageWidget geht das auch mit der Maus

Beitrag von Psychomax »

Hallo zusammen!

Ich versuch mich gerade parallel neben dem Animations Framework in die Gesture-Steuerung einzuarbeiten. Jetzt wollte ich spaßeshalber mal die ImageWidget Demo ausprobieren. Leider erkennt der keine Gesten mit der Mouse. Funktioniert das nur mit Touchscreens?

Momentan habe ich es auf Windows 7 und Windows Vista ausprobiert. Wollte meine Applikation, bevor es auf das eingebettete System kommt auf dem Desktop testen!

LG Max
Psychomax
Beiträge: 52
Registriert: 29. Dezember 2008 13:28

Beitrag von Psychomax »

Keiner eine Lösung perat?!
Psychomax
Beiträge: 52
Registriert: 29. Dezember 2008 13:28

Beitrag von Psychomax »

So ich hab mal versucht etwas tiefer dort einzusteigen. Allerdings erkennt Qt nicht mal eine Geste. Der gibt als Event immer nur MouseMove aus. was ja in der Regel nicht so schlecht ist.

Sind QPanGesture, QPinchGesture and QSwipeGesture alles Multitouch Gesten. Kann mit denen jetzt net so viel anfangen? Bei Pan bzw. Swipe ist doch nur wischen oder net?!
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Was liefert dir activeGestures() und wo behandelst du Sie?
Auf Win/ sollte es eig. gehen!
Psychomax
Beiträge: 52
Registriert: 29. Dezember 2008 13:28

Beitrag von Psychomax »

Hmm muss ich nochmal reinschauen. Hab ja bisher nur die demo gestartet und ein bißchen rumexperimentiert, warum es nicht gehen könnte...
Psychomax
Beiträge: 52
Registriert: 29. Dezember 2008 13:28

Beitrag von Psychomax »

Ach so das wir vom gleichen reden!

Code: Alles auswählen

#include "imagewidget.h"

#include <QtGui>

//! [constructor]
ImageWidget::ImageWidget(QWidget *parent)
    : QWidget(parent),
    position(0),
    horizontalOffset(0),
    verticalOffset(0),
    rotationAngle(0),
    scaleFactor(1),
    currentStepScaleFactor(1)

{
    setMinimumSize(QSize(100,100));

//! [enable gestures]
    grabGesture(Qt::PanGesture);
    grabGesture(Qt::PinchGesture);
    grabGesture(Qt::SwipeGesture);
    grabGesture(Qt::TapAndHoldGesture);
//! [enable gestures]
}
//! [constructor]

//! [event handler]
bool ImageWidget::event(QEvent *event)
{
    qDebug("HUHU: %d", event->type());
    if (event->type() == QEvent::Gesture)
        return gestureEvent(static_cast<QGestureEvent*>(event));
    return QWidget::event(event);
}
//! [event handler]

void ImageWidget::paintEvent(QPaintEvent*)
{
    QPainter p(this);

    float iw = currentImage.width();
    float ih = currentImage.height();
    float wh = height();
    float ww = width();

    p.translate(ww/2, wh/2);
    p.translate(horizontalOffset, verticalOffset);
    p.rotate(rotationAngle);
    p.scale(currentStepScaleFactor * scaleFactor, currentStepScaleFactor * scaleFactor);
    p.translate(-iw/2, -ih/2);
    p.drawImage(0, 0, currentImage);
}

void ImageWidget::mouseDoubleClickEvent(QMouseEvent *)
{
    rotationAngle = 0;
    scaleFactor = 1;
    currentStepScaleFactor = 1;
    verticalOffset = 0;
    horizontalOffset = 0;
    update();
}

//! [gesture event handler]
bool ImageWidget::gestureEvent(QGestureEvent *event)
{
    if (QGesture *swipe = event->gesture(Qt::SwipeGesture))
        swipeTriggered(static_cast<QSwipeGesture *>(swipe));
    else if (QGesture *pan = event->gesture(Qt::PanGesture))
        panTriggered(static_cast<QPanGesture *>(pan));
    if (QGesture *pinch = event->gesture(Qt::PinchGesture))
        pinchTriggered(static_cast<QPinchGesture *>(pinch));
    return true;
}
//! [gesture event handler]

void ImageWidget::panTriggered(QPanGesture *gesture)
{
#ifndef QT_NO_CURSOR
    switch (gesture->state()) {
        case Qt::GestureStarted:
        case Qt::GestureUpdated:
            setCursor(Qt::SizeAllCursor);
            break;
        default:
            setCursor(Qt::ArrowCursor);
    }
#endif
    QPointF delta = gesture->delta();
    horizontalOffset += delta.x();
    verticalOffset += delta.y();
    update();
}

void ImageWidget::pinchTriggered(QPinchGesture *gesture)
{
    QPinchGesture::ChangeFlags changeFlags = gesture->changeFlags();
    if (changeFlags & QPinchGesture::RotationAngleChanged) {
        qreal value = gesture->property("rotationAngle").toReal();
        qreal lastValue = gesture->property("lastRotationAngle").toReal();
        rotationAngle += value - lastValue;
    }
    if (changeFlags & QPinchGesture::ScaleFactorChanged) {
        qreal value = gesture->property("scaleFactor").toReal();
        currentStepScaleFactor = value;
    }
    if (gesture->state() == Qt::GestureFinished) {
        scaleFactor *= currentStepScaleFactor;
        currentStepScaleFactor = 1;
    }
    update();
}

//! [swipe function]
void ImageWidget::swipeTriggered(QSwipeGesture *gesture)
{
    if (gesture->state() == Qt::GestureFinished) {
        if (gesture->horizontalDirection() == QSwipeGesture::Left
            || gesture->verticalDirection() == QSwipeGesture::Up)
            goPrevImage();
        else
            goNextImage();
        update();
    }
}
//! [swipe function]

void ImageWidget::resizeEvent(QResizeEvent*)
{
    update();
}

void ImageWidget::openDirectory(const QString &path)
{
    this->path = path;
    QDir dir(path);
    QStringList nameFilters;
    nameFilters << "*.jpg" << "*.png";
    files = dir.entryList(nameFilters, QDir::Files|QDir::Readable, QDir::Name);

    position = 0;
    goToImage(0);
    update();
}

QImage ImageWidget::loadImage(const QString &fileName)
{
    QImageReader reader(fileName);
    if (!reader.canRead()) {
        qDebug() << fileName << ": can't load image";
        return QImage();
    }

    QImage image;
    if (!reader.read(&image)) {
        qDebug() << fileName << ": corrupted image";
        return QImage();
    }
    return image;
}

void ImageWidget::goNextImage()
{
    if (files.isEmpty())
        return;

    if (position < files.size()-1) {
        ++position;
        prevImage = currentImage;
        currentImage = nextImage;
        if (position+1 < files.size())
            nextImage = loadImage(path+QLatin1String("/")+files.at(position+1));
        else
            nextImage = QImage();
    }
    update();
}

void ImageWidget::goPrevImage()
{
    if (files.isEmpty())
        return;

    if (position > 0) {
        --position;
        nextImage = currentImage;
        currentImage = prevImage;
        if (position > 0)
            prevImage = loadImage(path+QLatin1String("/")+files.at(position-1));
        else
            prevImage = QImage();
    }
    update();
}

void ImageWidget::goToImage(int index)
{
    if (files.isEmpty())
        return;

    if (index < 0 || index >= files.size()) {
        qDebug() << "goToImage: invalid index: " << index;
        return;
    }

    if (index == position+1) {
        goNextImage();
        return;
    }

    if (position > 0 && index == position-1) {
        goPrevImage();
        return;
    }

    position = index;

    if (index > 0)
        prevImage = loadImage(path+QLatin1String("/")+files.at(position-1));
    else
        prevImage = QImage();
    currentImage = loadImage(path+QLatin1String("/")+files.at(position));
    if (position+1 < files.size())
        nextImage = loadImage(path+QLatin1String("/")+files.at(position+1));
    else
        nextImage = QImage();
    update();
}
Problem ist ja ich kann gar kein "activeGestures" auslesen, weil "bool ImageWidget::gestureEvent(QGestureEvent *event)" nicht ausgelöst wird. :(

"bool ImageWidget::event(QEvent *event)" die geht wunderbar. Allerdings gibt mir der event->type() 5 zurück, was gleichbedeutetend mit Mousemove ist.
ms47
Beiträge: 35
Registriert: 22. Januar 2009 10:02

Beitrag von ms47 »

Psychomax hat geschrieben:Ach so das wir vom gleichen reden!


Problem ist ja ich kann gar kein "activeGestures" auslesen, weil "bool ImageWidget::gestureEvent(QGestureEvent *event)" nicht ausgelöst wird. :(

"bool ImageWidget::event(QEvent *event)" die geht wunderbar. Allerdings gibt mir der event->type() 5 zurück, was gleichbedeutetend mit Mousemove ist.
da bin ich nun auch in deiner Welt :wink:

Habe genau das gleiche Problem. Ein Event wird natürlich ausgelöst, aber kein QEvent::Gesture mit der Nummer 198.
spikey
Beiträge: 2
Registriert: 11. Februar 2010 10:46

Keine Chance fuer Gestures?

Beitrag von spikey »

Ich suche dringend jemanden der es geschaft hat, ein gestures Beispiel zu implementieren.

Ich verwende xserver unter Debian.

Ich kompilierte folgendes Beispiel:

Code: Alles auswählen

/qt/examples/gestures/imagegestures/imagegestures
es ist Bestandteil von Qt Creator 1.3.1 (Based on Qt 4.6.1 (32 bit)).


In anderen Foren haben sie die gleichen Probleme. Ich habe ein ganz schlechtes Gefuehl, seid Nokia Trolltech uebernommen hat. Schoene Marketing Blogs und dann gibts nur noch einen link zu nem git-repository (z.B. Qt Mobiliy, der verstuemmelte Nachfolger von Qt Extended) und keine vollstaendige Doku. Sorry, aber es braucht noch bischen was mehr als nur ne API Referenz. Zumal wenn das zeugs nicht tut.

Bitte schreibt doch, wenn Ihr ne Idee habt, was da falsch laeuft. Ich kriege nur zB. doubleclicks aber guestures werden nie ausgeloest.

Spikey
Antworten