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
Gesture-Demo: ImageWidget geht das auch mit der Maus
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?!
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?!
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.
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();
}
"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 WeltPsychomax 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.
Habe genau das gleiche Problem. Ein Event wird natürlich ausgelöst, aber kein QEvent::Gesture mit der Nummer 198.
Keine Chance fuer Gestures?
Ich suche dringend jemanden der es geschaft hat, ein gestures Beispiel zu implementieren.
Ich verwende xserver unter Debian.
Ich kompilierte folgendes Beispiel:
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
Ich verwende xserver unter Debian.
Ich kompilierte folgendes Beispiel:
Code: Alles auswählen
/qt/examples/gestures/imagegestures/imagegesturesIn 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