FAQ Qt FAQ Qt Creator FAQ PyQt & PySide

FAQ QtConsultez toutes les FAQ

Nombre d'auteurs : 26, nombre de questions : 298, dernière mise à jour : 6 mai 2017 

 
OuvrirSommaireModulesQt CoreÉvénements

Les QObject possèdent un système d'événements. Ceci leur permet de définir des actions en fonction de certains types d'événements qu'ils reçoivent. Par exemple, à la fin d'un timer ou lors d'un paint sur un widget.
Il est donc très important de pouvoir les manipuler. Pour cela, il existe deux méthodes.

1 - La surcharge de fonction
Lorsqu'un QObject reçoit un événement, celui-ci passe par la fonction bool QObject::event(QEvent *). C'est le point d'entrée lorsqu'un événement arrive sur un QObject. Cette fonction va ensuite vérifier le type de l'événement et appeler une sous-fonction liée à ce type. Toutes ces fonctions ont pour signature void XXXEvent(QXXXEvent *) et sont principalement définies dans QObject et QWidget. Par exemple, si l'événement est un QPaintEvent, la fonction paintEvent() sera appelée. Il suffit donc de choisir la méthode à surcharger suivant l'événement avec lequel on veut interagir.

Par exemple, comment tracer une courbe en fonction des clics de souris ?

 
CacherSélectionnez

2 - Event filter
Cette méthode consiste à installer un filtre d'événements sur un QObject. Ce filtre d'événements est en réalité un QObject. Cette méthode a l'avantage d'éviter des héritages inutiles et de pouvoir manipuler les événements d'un ou plusieurs autres QObject.

Pour qu'un QObject puisse être utilisé comme filtre, il doit surcharger la méthode bool QObject::eventFilter(QObject *obj, QEvent *event). Cette méthode prend en paramètres un QObject correspondant au QObject à filtrer et un QEvent, son événement. Si la fonction retourne vrai, le traitement de l'événement par QObject est interrompu. Si la fonction retourne faux, l'événement sera traité par le QObject.

Ensuite, il suffit d'appeler la méthode installEventFilter(QObject *) du QObject à filtrer avec pour paramètre le QObject servant de filtre.

 
CacherSélectionnez

la méthode par la surcharge de fonctions est utilisée pour manipuler les événements du QObject par lui-même. Tandis que la méthode avec les filtres d'événements est surtout utilisée pour filtrer et interagir avec les événements d'un autre QObject.

Mis à jour le 7 mai 2012  par Yan Verdavaine

Si une action longue est exécutée (comme un parcours récursif de répertoire, une copie de plusieurs fichiers…) par l'IHM, celle-ci va se geler et ne plus répondre… Pour remédier à cela, il est souvent préférable d'utiliser un thread.

Mais il existe une alternative intéressante lorsque ce traitement n'a vraiment aucun intérêt à être mis dans un thread : QCoreApplication (et donc QApplication ) possède la méthode statique processevents() permettant l'exécution d'une partie ou de tous les événements de la boucle d'événements.

Simulation d'un traitement long : l'un utilise le processevents ; l'autre, non
CacherSélectionnez
Mis à jour le 8 avril 2017  par Yan Verdavaine

Qt propose un moyen d'écouter les événements clavier (appuis sur une touche du clavier) simplement grâce à la surcharge de méthodes pour tout objet dérivant de QWidget.

Deux conditions pour écouter les événements clavier :
  • utiliser un dérivé de QWidget, afin de pouvoir surcharger les méthodes keyPressEvent et keyReleaseEvent. C'est ces méthodes qui seront appelées à chaque appui et relâchement d'une touche, et c'est elles qui permettront de décider de l'action à effectuer ;
  • paramétrer le dérivé de QWidget pour qu'il accepte le focus (voir QWidget::setFocusPolicy). Ce widget doit avoir le focus au moment où vous souhaitez écouter l'événement clavier (pour une fenêtre, par exemple, celle-ci doit être active).

Nous allons créer la classe MonWidget qui proposera la détection d'événements clavier et qui pourra afficher un message en fonction de la touche relâchée.

En-tête
Sélectionnez
#include <QWidget>
#include <QKeyEvent>
 
class MonWidget : public QWidget
{
   Q_OBJECT
public:
   void MonWidget(QWidget * parent = 0);
 
protected:
   void keyReleaseEvent(QKeyEvent * e);
};
 
Sélectionnez
#include <QMessageBox>
 
MonWidget::MonWidget(QWidget * parent) : MonWidget(parent)
{}
 
//Cette méthode est appelée à chaque relâchement d'une touche clavier
void MonWidget::keyReleaseEvent(QKeyEvent * e)
{
   //L'argument e contient entre autres le nom de la touche relâchée
   if(e->key() == Qt::Key_Space) //Si la touche relâchée est espace
   {
       QMessageBox msgBox;
       msgBox.setText("La touche espace a été relâchée !");
       msgBox.exec();
   }
}
Remarques
  • Il est aussi possible de surcharger keyPressEvent. Cette méthode fonctionne de la même manière que keyReleaseEvent, à la différence qu'elle est appelée lorsque la touche clavier est pressée.
  • Voir Qt::Key pour le listing des touches supportées par Qt.
  • Il est possible de repérer des combinaisons de touches avec Ctrl, Alt, etc. moyennant QKeyEvent::modifiers. Le listing des modifiers est présent dans l'énumération Qt::KeyboardModifier. Il est aussi possible de récupérer ceci via QApplication::keyboardModifiers. Cette méthode statique est accessible de n'importe où dans votre application Qt.
Il existe d'autres moyens pour écouter les événements clavier :
  • utilisation de l'API de votre OS ;
  • utilisation de la classe QxtGlobalShortcut de la librairie Qxt.

L'avantage principal de ces alternatives, c'est qu'il est possible de détecter les événements clavier sans focus particulier dans votre application.

Créé le 7 mai 2012  par Niak74

Lien : Comment manipuler les événements de Qt ?

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2006 - 2017 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.