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 :

Qt et clavier


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut Qt et clavier
    Salut,

    J'aimerai savoir comment tester si une touche du clavier est activée.
    Je ne cherche pas à créer un raccourci pour une action, je veux juste avoir true si la touche est activé et false sinon. Je veux utiliser ceci dans ma fonction comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void mafonction()
    {
      if( ma touche est activée )
      {
        ...
       }
     
      else
      {
         ...
       }
    }
    Mon application utilise un QMainWindow dans lequel j'ai des QToolbar et d'autres QWidget

    Merci

  2. #2
    Membre expérimenté Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Par défaut
    salut, il faut te servir des event puis du code de la touche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void mafonction::keyPressEvent(QKeyEvent *event)
    {
        switch (event->key()) {
        case Qt::Key_Up:
            QMessageBox::warning(this, "titre messageBox", "la touche up a ete activee");
            break;
        case Qt::Key_End:
            ...
        default:
            QWidget::keyPressEvent(event);
        }
    }
    pour connaître les codes touches, tape Qt::key dans l'aide
    enfin, il faut que tu surcharges
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    virtual void keyPressEvent ( QKeyEvent * event )

  3. #3
    Membre expérimenté Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Par défaut
    Je viens de faire un test rapide, avec une nouvelle QMainwindow (je suppose que j'ai le même projet que toi dans le fond).

    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
    #include <QtGui/QMainWindow>
    #include "ui_testaeffacer.h"
    #include <QMessageBox>
    #include <QKeyEvent>
    
    dans le header: 
    class testaeffacer : public QMainWindow
    {
    	Q_OBJECT
    
    public:
    	testaeffacer(QWidget *parent = 0, Qt::WFlags flags = 0);
    	~testaeffacer();
    
    protected:
    	void keyPressEvent(QKeyEvent *event);
    
    private:
    	Ui::testaeffacerClass ui;
    };
    
    #endif // TESTAEFFACER_H

    dans le cpp :

    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
    #include "testaeffacer.h"
     
    testaeffacer::testaeffacer(QWidget *parent, Qt::WFlags flags)
    	: QMainWindow(parent, flags)
    {
    	ui.setupUi(this);
    }
     
    testaeffacer::~testaeffacer()
    {
     
    }
     
    void testaeffacer::keyPressEvent(QKeyEvent *event)
    {
    	switch (event->key())
    	{
    	case Qt::Key_Up:
    		QMessageBox::warning(this, "titre message box", "touche up");
    	break;
    	}
    	QWidget::keyPressEvent(event);
    }

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut
    Merci pour tes reponses.

    Malgrès que ceci ne répond pas exactement à ma question mais ca aide bien.

    dans ta class testaeffacer supposons que j'ai une fonction mafonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    bool testaeffacer::maFonction(QString key)
    {
    }
    Le but est que cette fonction return true si la "key" est active et false sinon.

    si on veut utiliser ta fonction keyPressEvent, il faut faire 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
     
    QString cle; // un attribut de ta classe
     
    void testaeffacer::keyPressEvent(QKeyEvent *event)
    {
      this->cle = event->text();
    }
     
    bool testaeffacer::maFonction(QString key)
    {
      if(key == this->cle)
        return true;
     
      return false;
    }
    ce qui devrais fonctionner j'imagine

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut
    en faite ceci ne fonctionne pas dans mon cas parce que ma classe n'est pas une classe dérivée de QMainWindow ni de QWidget. ma classe est de la forme suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     class pqCore : public QObject
    {
      Q_OBJECT
     
    public:
     
      bool mafonction();
     
    private:
      QToolBar *toolbar; // toolbar sera relié à une QToolbar crée dans Qt Designer
    ca me sert à rien de surcharger la classe QToolbar puisque mon objet toolbar est crée à l'intérieur de Qt Designer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    bool pqCore::mafonction()
    {
      //comment savoir quel boutton du clavier est active ici ???
      //je veux savoir ceci lorsque ma toolbar est active 
    }

  6. #6
    Membre très actif
    Avatar de FloMo
    Homme Profil pro
    Freelance iOS
    Inscrit en
    Juillet 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Freelance iOS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 726
    Par défaut
    Si tu veux utiliser le clavier, tu dois passer par un QWidget. (ou dérivé)

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut
    qu'est ce que la dernière ligne fait ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QWidget::keyPressEvent(event);

  8. #8
    Membre expérimenté Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Par défaut
    salut, excuse pour le retard à répondre.
    Alors, plus clairement, dans mon exemple, ma classe testaeffacer dérive de QWidget dont voici la doc : doc de QWidget

    En regardant la doc, tu vas voir que la plupart des fonctions ayant des évenements pour paramètres des évenements sont dans la catégories Protected Functions et sont de plus virtuelles pures, ce qui signifie que lorsque tu crée une classe qui dérive de QWidget, tu peux réimplémenter ces fonctions pour modifier leur comportement, ce qui est le cas ici car tu veux effectuer quelque chose de particulier lorsqu'une touche particulière est pressée.

    Cependant, lorsque tu réimplémentes ces fonctions, il se peut que tu perdes une partie du comportement originel (celui de la classe dont tu dérives) et que tu voudrais bien le laisser, pour cela tu appelles la méthode de base en lui redonnant le event que tu avais reçu.

    Pour un cas plus concret (faudrait que je vérifie) : J'avais crée une classe qui dérive de QListWidget. Ce que je voulais c'était modifier la manière dont les éléments de la liste sont coloriés, j'ai donc réimplémenté la méthode paintevent (doc du paintEvent). ça fonctionnait, sauf que lorsque je cliquais un item, il ne se passait rien du tout (normalement son fond devient bleu). J'ai alors dû (merci mongaulois) rajouter l'appel à la méthode paintevent de l'objet de base.

    pour info, voilà à quoi ça ressemble du coup :

    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
    //========================================
    //				FONCTIONS DE DESSIN				
    //=======================================
     
    //-------------------------------------------------------------- paintEvent
    void QLinkedListWidget::paintEvent(QPaintEvent *event)
    {
        if (this->viewport())
    	{
    		QPainter painter(this->viewport());
     
    		//----- reglages pinceau, crayon ...
    		painter.setRenderHint(QPainter::Antialiasing, true);
    		painter.setPen(QPen(Qt::darkGray, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
    		painter.setBrush(QBrush(QColor(235,235,255), Qt::SolidPattern));
     
    		//----- Trace du fond de la liste
    		drawBackground(painter);
     
    		//----- tracé du fond et cadre autour des items
    		drawItemFrame(painter);
     
    		// Tracé des fleches
    		linkItemsWithArrows(painter);
    	}
     
    	//----- On rappelle le paint event de la classe de base
    	QListWidget::paintEvent(event);
    	event->accept();
    }

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut
    Merci Kestufou pour ta réponse bien détaillée

    finalement j'ai surchargé keyPressEvent dans ma classe qui dérive de QMainWindow et j'ai transmis un signal à mon autre classe qui dérive de QObject pour lui dire si la touche ctrl est active ou non.

    Merci à tous

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut
    Salut,

    Je sais que j'ai posé un peu trop de question mais celle ci me semble interessante. ( sur le même sujet )

    Dans mon application j'ai un QMainWindow et d'autre QWidget, QToolBar...

    Ce que je cherche à faire et detecter si la touche ctrl est activé lorsque l'utilisateur click sur une action de une d'une toolbar.

    J'ai une SLOT loadAction() qui est appelée chaque fois que l'utilisateur click sur une action.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void loadAction()
    {
      if(ctrl) // si ctrl est active, c'est une selection qu'on veut faire
      {
         appelez la fonction de selection;
         return;
       }
      else
         charger l'action;
    }
    Maintenant pour savoir si la touche ctrl est active, j'ai surchargé les fonction KeyPressEvent et keyReleaseEvent comme discuté précedement dans cette discussion:
    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
    void MaToolbar::keyPressEvent(QKeyEvent *e)
    {	
    	if((!e->isAutoRepeat())&&(e->key()==Qt::Key_Control))
    		emit setCtrlKey(true);
    	else
    		e->ignore();
    	QToolBar::keyPressEvent(e);
    }
     
    void MaToolbar::keyReleaseEvent(QKeyEvent *e)
    {
    	if((!e->isAutoRepeat())&&(e->key()==Qt::Key_Control))
    		emit setCtrlKey(false);
    	else
    		e->ignore();
     
    	QToolBar::keyReleaseEvent(e);
    }
    Maintenant ce qui arrive est que le clavier est souvent utilisé par d'autres widget dans mon application, et donc je ne peux pas réserver le clavier à ma toolbar en utilisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaToolbarObjet->grabKeyboard();
    Pour contourner ce problème, je me suis dit que je pourrai attendre que la souris sois au dessus de ma toolbar et ensuite utiliser grabKeyboard(). c'est pourquoi j'ai surchargé les fonctions enterEvent et leaveEvent de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void MaToolbar::enterEvent(QEvent *e)
    {
             this->grabKeyboard();
             QToolBar::enterEvent(e)
    }
    void MaToolbar::leaveEvent(QEvent *e)
    {
           this->releaseKeyboard();
           QToolBar::leaveEvent(e)
    }
    Maintenant ca fonctionne assez bien, sauf que si je pèse sur ctrl avant que ma souris ne soit sur la toolbar, le keyPressEvent n'est pas appelé et donc je ne peux pas détecter la touche ctrl

    J'ai essayé de faire un setFocusPolicy(Qt::StrongFocus) sur ma toolbar dans la classe du MainWindow qui gère l'application, Ceci n'a pas résolu le problème parce que d'autres widget prenne le Focus lorsqu'on les utilises.

    Le problème ici est que si ctrl est activé avant que la toolbar n'ait le Focus, KeyPressEvent ne sera pas appelée. L'idéal est que une fois le Focus obtenu, la fonction keyPressEvent de ma toolbar soit appelée si un boutton est dejà active (et non pas uniquement si le button est activé pendant que la toolbar a le Focus).

    des idées ?

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    A mon avis ceci peut correspondre
    http://qt.developpez.com/doc/latest/...boardModifiers

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Merci Mongaulois !!!!!!!!

    Grâce à l'aide de Mongaulois, je vous annonce que la solution est tout simplement ceci::
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(QApplication::keyboardModifiers() == Qt::ControlModifier)
    {
    }


    Ces modifiers permettent de savoir en tout temps si une des touches suivantes est active:

    Qt::NoModifier -> aucune touche n'est active
    Qt::ShiftModifier -> Shift est active
    Qt::ControlModifier -> Ctrl active.
    Qt::AltModifier ->Alt active
    Qt::MetaModifier -> Ctrl pour un Mac ou touche windows pour pc.
    Qt::KeypadModifier -> A keypad button is pressed
    Qt::GroupSwitchModifier -> X11 only. A Mode_switch key on the keyboard is pressed.

    (Je ne suis pas sure pour les 2 derniers)

    Existe-il quelque chose de similaire mais qui permet d'identifier n'importe qu'elle touche active du clavier ?

  13. #13
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Nehmé Voir le message
    Existe-il quelque chose de similaire mais qui permet d'identifier n'importe qu'elle touche active du clavier ?
    a ma connaissance, non

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

Discussions similaires

  1. [Turbo Pascal] Entrée au clavier sous forme ******
    Par Upal dans le forum Turbo Pascal
    Réponses: 12
    Dernier message: 15/02/2003, 14h42
  2. [TP]vider le tampon clavier
    Par kael kael dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 11/01/2003, 22h19
  3. Clavier Azerty
    Par Smortex dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 16/12/2002, 20h33
  4. Cherche Nom des touches du clavier
    Par juan64 dans le forum C++Builder
    Réponses: 8
    Dernier message: 23/07/2002, 19h11
  5. Vider le buffer du clavier
    Par flavien tetart dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 12/07/2002, 08h35

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