IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

QGestureRecognizer de base


Sujet :

Qt

  1. #1
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 24
    Par défaut QGestureRecognizer de base
    Bonjour,

    Je cherche à créer mon propre GestureRecognizer. Vous le savez peut être déjà, aucun exemple n'existe sur internet, donc j'ai commencé en se basant sur la doc Qt, j'avoue que ce n'est pas vraiment facile ..

    j'essaye dans mon exemple de détecter quand l'utilisateur pose 1 doigts sur l'écran. (n'importe quel geste à un doigt devrait être reconnu)

    donc, ma class MyGestureRecognizer ressemble à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    class MyGesture : public QGesture
    {};
     
    class MyGestureRecognizer : public QGestureRecognizer
    {
        virtual QGesture *create ( QObject * target )
        {
            qDebug() << "create";
            return new MyGesture;
        }
        virtual void reset ( QGesture * gesture )
        {
            qDebug() << "reset";
            QGestureRecognizer::reset(gesture);
        }
     
        virtual Result recognize(QGesture * , QObject * , QEvent * event)
        {
            qDebug() << "recognize";
            if(event->type() == QEvent::TouchUpdate)
                if(static_cast<QTouchEvent *>(event)->touchPoints().size() == 2){
                    qDebug() << "bingo";
                    return QGestureRecognizer::TriggerGesture;
                }
            return QGestureRecognizer::Ignore;
        }
    };
    Ensuite, j'ai créer un widget qui va prendre en compte ce nouveau geste, la class de ce widget est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    FormCustomGest::FormCustomGest(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::FormCustomGest)
    {
        ui->setupUi(this);
     
        // Set touch attribute
        setAttribute(Qt::WA_AcceptTouchEvents);
     
        //! [enable gestures]
        grabGesture(Qt::CustomGesture);
        //! [enable gestures]
     
        Qt::GestureType type = QGestureRecognizer::registerRecognizer(new MyGestureRecognizer());
        qDebug() << "Type:" << type;
    }
     
    FormCustomGest::~FormCustomGest()
    {
        delete ui;
    }
     
    bool FormCustomGest::gestureEvent(QGestureEvent *event)
    {
        if (QGesture *pinch = event->gesture(Qt::CustomGesture))
        {
            ui->gest->setText("ok");
        }
        ui->gest->setText("Nok");
        return true;
    }
     
    bool FormCustomGest::event(QEvent * event )
    {
        if(event->type() == QEvent::Gesture){
            return gestureEvent(static_cast<QGestureEvent*>(event));
        }
     
        return QWidget::event(event);
    }
    Enfin, dans un MainWindow, j'utilise ce widget comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        FormCustomGest* f = new FormCustomGest(this);
        setCentralWidget(f);
    Le problème c'est que mon geste n'est jamais reconnu.
    SAUF SI, je fait hérité mon "MyGeste" de TapGeste, et que je remplace tous les Qt::CustomGesture par des Qt::TapGesture dans le widget, Ce qui est pas vraiment ce que je veux.

    Pour résumer, mon widget, ne reconnais jamais les CustomGesture!!

    J'ai essayé d'être le plus claire possible, et je pense que je vous est mis tous le code nécessaire.

    Merci pour votre aide, je suis vraiment bloqué

  2. #2
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 24
    Par défaut
    Bon, vu qu'il n'y a pas eu de réponse, je met une correction pour les intéressés :

    En fait le problème venait du type de geste, après plusieurs jour de recherche, voici ce que ça donne un code qui marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    FormCustomGest::FormCustomGest(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::FormCustomGest)
    {
        ui->setupUi(this);
     
        // Set touch attribute
        setAttribute(Qt::WA_AcceptTouchEvents);
     
     
        type = QGestureRecognizer::registerRecognizer(new MyGestureRecognizer());
     
        //! [enable new gestures]
        grabGesture(type);
        //! [enable new gestures]
    }
     
    FormCustomGest::~FormCustomGest()
    {
        delete ui;
    }
     
    bool FormCustomGest::gestureEvent(QGestureEvent *event)
    {
        if (QGesture *pinch = event->gesture(type))
        {
            ui->gest->setText("ok");
        }
        ui->gest->setText("Nok");
        return true;
    }
     
    bool FormCustomGest::event(QEvent * event )
    {
        if(event->type() == QEvent::Gesture){
            return gestureEvent(static_cast<QGestureEvent*>(event));
        }
     
        return QWidget::event(event);
    }
    avec type est de type Qt::GestureType, à déclarer dans le .h

    Maintenant, il suffit de modifier la fonction recognize dans MyGestureRecognizer pour définir, à votre guise, un geste plus compliqué que détecter deux doigts

    a bon entendeur!

  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Merci d'être venu donner ta solution.
    Il est vrai qu'il y a encore peu d'intervenant ici qui utilisent gesture...

    Bonne continuation

  4. #4
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 24
    Par défaut
    effectivement! et même la doc de Qt concernant ce point là, n'est pas très claire :s

    Enfin, avec un petit peu de recherche et beaucoup de teste, on y arrive à la fin

    Merci en tout cas pour ton soutient

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Windows]accès base de registre windows
    Par Greg01 dans le forum API standards et tierces
    Réponses: 27
    Dernier message: 05/06/2007, 15h14
  2. taille maximale d'une base de donnée paradox
    Par Anonymous dans le forum Paradox
    Réponses: 5
    Dernier message: 14/02/2004, 17h39
  3. sauver une base
    Par phil_java dans le forum Administration
    Réponses: 3
    Dernier message: 07/03/2003, 17h08
  4. [Concept] Stabilité d'une base de donnée
    Par lassmust dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 03/07/2002, 16h16
  5. Utilisez vous la base de registres ?
    Par gRRosminet dans le forum C++Builder
    Réponses: 8
    Dernier message: 04/06/2002, 13h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo