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 Quick Discussion :

Transmettre la gestion d'un événement Key


Sujet :

Qt Quick

  1. #1
    Membre averti
    Avatar de Niak74
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Points : 333
    Points
    333
    Par défaut Transmettre la gestion d'un événement Key
    Bonjour,

    J'utilise une TableView, et je souhaite bypasser la gestion de la touche clavier Return. Effectivement, celle-ci est traitée par la TableView et l'event n'est donc pas propagé aux parents.

    Pour le moment, je gère la chose en émettant un signal perso que je récupère au niveau souhaité, mais je préférerai avoir accès à mon event clavier...

    Une autre solution pourrai être de générer un event clavier pour simuler la propagation aux parents, mais ce n'est apparemment pas simple à mettre en place, et surtout pas très joli.

    Y a-t-il donc un moyen de redéfinir la gestion d'un Key event à la façon QWidget (surcharge de keyPressEvent) ou d'indiquer à mon item TableView de ne pas gérer des touches spécifiques ?


    Voici un aperçu du code :

    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
     
    Item
    {
        Keys.onPressed    {
            console.debug("WIN");
        }
     
        TableView
        {
            Keys.onReturnPressed
            {
                console.debug("Return");
                event.accepted = false;
            }
            Keys.onPressed
            {
                if(event.key === Qt.Key_Return)
                {
                     console.debug("Gen Return");
                     event.accepted = false;
                }
           }
        }
    }
    Le but étant d'avoir "WIN" affiché en console quand j'appuie sur Return. Ça marche bien avec toutes les autres touches clavier qui ne sont pas "accepted" par la TableView.


    Merci !
    Un clavier Azerty en vaut deux.

  2. #2
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Bonjour,

    Si le signal accepted ne fonctionne pas (voir également http://doc.qt.io/qt-5/qml-qtquick-ke...#priority-prop), je n'ai qu'une seule solution à vous proposer : eventFilter() sur qApp de sorte d'attendre l'event et d'émettre un nouveau signal quand vous recevez l'event cherché.

    J'ai eu à faire ce genre de chose dans un projet où je cherchais à utiliser à plusieurs occasions en même temps les events souris d'un Flickable sans pour autant en briser le comportement (PinchArea ne me suffisait pas).

    Code c++ : 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
    42
    43
    44
    45
    46
    47
    #include <QCoreApplication>
    #include "mapzoomcontroller.h"
     
    MapZoomController::MapZoomController(QObject *parent)
        : QObject(parent)
    {
        _timer.setSingleShot(true);
        _timer.setInterval(600);
        connect(&_timer, SIGNAL(timeout()), this, SLOT(onTimeout()));
        qApp->installEventFilter(this);
    }
     
    MapZoomController::~MapZoomController()
    {
    }
     
    void MapZoomController::registerMap(QQuickItem *map)
    {
        _map = map;
    }
     
    void MapZoomController::onTimeout()
    {
        emit zoomRequest();
    }
     
    bool MapZoomController::eventFilter(QObject *obj, QEvent *e)
    {
        if (e && _map)
        {
            if (e->type() == QEvent::MouseButtonPress)
            {
                QMouseEvent *me = dynamic_cast<QMouseEvent *>(e);
                if (_map->contains(_map->mapFromScene(me->pos())))
                    _timer.start();
            }
            else if (e->type() == QEvent::MouseMove && _timer.isActive())
                _timer.stop();
            else if (e->type() == QEvent::MouseButtonRelease)
            {
                _timer.stop();
                emit resetRequest();
            }
        }
     
        return QObject::eventFilter(obj, e);
    }

    Avant la création de la scène :

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    qmlRegisterType<MapZoomController>("Game", 1, 0, "MapZoomController");

    Dans le code QML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MapZoomController {
        Component.onCompleted{ registerMap(internalContainer); }
        onZoomRequest: // ...
        onResetRequest: // ...
    }
    Dans votre cas, il faudra bien refuser l'event s'il s'agit d'un Return dans le eventFilter() concernant un QObject de type TableView (ou pas, selon vos besoins - vous pouvez utiliser l'objectname pour plus de facilité) et émettre un signal approprié.

    Si d'autres connaissent des solutions plus simples, n'hésitez pas, parce que c'est une solution assez brute.

    Bonne journée,
    Louis
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  3. #3
    Membre averti
    Avatar de Niak74
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Points : 333
    Points
    333
    Par défaut
    Merci pour la solution. Effectivement, ça peut tout à fait fonctionner comme ça.

    Cependant mon but est vraiment de me passer de code "externe". Je voulais régler ce problème uniquement au niveau du QML (ma tableview est encapsulée dans un fichier type MyTableView.qml) pour éviter justement d'avoir ce genre de traitement dans le C++.

    La seule solution que je vois pour le moment c'est d'aller modifier les sources de Qt et virer la gestion de cette touche dans le code de la TableView... Mais c'est violent !
    Un clavier Azerty en vaut deux.

Discussions similaires

  1. gestion de l'événement key-press-event
    Par awalter1 dans le forum GTK+ avec Python
    Réponses: 2
    Dernier message: 19/09/2007, 17h25
  2. [DOM] Pb gestion de l'évènement mouseout sur une <DIV>
    Par rvux69 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 22/01/2007, 21h27
  3. [MAJ]Problème de propagation d'évènement + Key Binding
    Par seiryujay dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 23/06/2006, 16h19
  4. [C#] Débutant. Comment supprimer la gestion d'un évènement.
    Par Pierre8r dans le forum Windows Forms
    Réponses: 2
    Dernier message: 10/04/2006, 16h16

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